在尝试更新不存在的行时,Informix不会抛出错误?

时间:2016-06-08 16:46:39

标签: c informix

我们正在分析生产中的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;
}

1 个答案:

答案 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 -croncheck -ci)之前,我可能会做一些常规检查(例如oncheck -cd来检查保留的页面)。使用-cR-cI-cD选项获取更多信息可能值得。