我们正在分析生产中的Informix行为。当尝试更新不存在的行时,应用程序在生产中出现“-346:无法更新表中的行”错误。
但是,当我们在开发区域尝试相同时,应用程序正常工作。
在更新不存在的行或Informix级别可配置的行时,Informix是否应该始终抛出错误?
应用程序是用C语言编写的,相应的更新查询存在于“.ec”程序中。
此外,还有其他方式Informix会抛出-346错误吗?
编辑:SQL如下:
update <table> set serial_number = <number1> where serial_number = <number2>
SQL错误是:
Execute SQL ERROR SQL CODE = -346 SQLERM = SQLERRP = SQLERRD[0] = 1 SQLERRD[1] = -100 SQLERRD[2] = 0 SQLERRD[3] = 1 SQLERRD[4] = 56 SQLERRD[5] = 0 SQLWARN =
再次编辑:
源代码如下:
const char *sql = "update table_not_named set serial_number = ? where serial_number = ?";
if ( prepared_sql == 0 )
{
exec sql prepare update_sql from :sql;
if ( sqlca.sqlcode != SQL_OK )
{
logSqlError( log_err, __func__, "Prepare" );
return FAIL;
}
prepared_sql = 1;
}
exec sql execute update_sql using :db_new_serial_number, :db_old_serial_number;
if ( sqlca.sqlcode != SQL_OK )
{
logSqlError( log_err, __func__, "Execute" );
return FAIL;
}
答案 0 :(得分:1)
这些评论变得太大而无法发表评论 - 差不多。
错误-346不存在/缺席的问题。 finderr -346
的说明说:
当数据库服务器正在处理UPDATE时,它收到意外错误。有关原因的更多详细信息,请查看随附的ISAM错误代码。可能的原因包括硬件错误和锁定冲突。
您需要跟踪ISAM错误(ESQL / C中的sqca.sqlerrd [1])以获取更多信息;它应该是一个绝对值介于100和199之间的错误号。这可能意味着您的生产系统存在某种问题。
请注意,使用搜索到的UPDATE更新不存在的行应该只报告已成功更新的零行。在MODE ANSI数据库中,您将获得状态100(SQLNOTFOUND)而不是0(无错误)。如果你正在进行WHERE CURRENT OF更新并且行丢失了,那么确实会发生一些奇怪的事情 - 它不会发生(因为它意味着当你选择它时你没有锁定该行,但有人设法删除该行,即使你应该将其锁定)。如果您没有使用FOR UPDATE子句,那么WHERE CURRENT OF应该有更具体的错误。
此时,问题已更新以显示错误信息。
好奇的消息:我跑了
create table sample
(
serial_number integer not null primary key,
value varchar(30) not null
);
insert into sample values(123, 'one hundred and twenty-three');
update sample set serial_number = 124 where serial_number = 99;
,其状态为0(并报告0行已更新)。您的邮件有-100
作为ISAM错误;这是'ISAM错误的消息:具有唯一键的记录的重复值'。
但是当我尝试时:
insert into sample values(99, 'ninety-nine');
update sample set serial_number = 123 where serial_number = 99;
我收到错误:
SQL -268: Unique constraint (jleffler.u160_350) violated.
ISAM -100: ISAM error: duplicate value for a record with unique key.
这就是我所期待的。我注意到你不能直接更新SERIAL(或SERIAL8或BIGSERIAL)类型的列:你得到SQL -232: A SERIAL column (s) may not be updated
(其中s
是我试图更新以生成消息的串行列的名称 - 消息中的复数并不是很复杂。)
由于错误-346的主要消息表明数据库中可能存在问题,因此值得在系统上运行ON-Check(oncheck
)以查看该表是否全部正常。如果您不习惯运行ON-Check,则需要查找选项。在继续验证表和发生问题的索引(oncheck -cr
和oncheck -ci
)之前,我可能会做一些常规检查(例如oncheck -cd
来检查保留的页面)。使用-cR
,-cI
,-cD
选项获取更多信息可能值得。