2016-06-08 6 views
1

Wir analysieren ein Informix-Verhalten in der Produktion. Beim Versuch, eine Zeile zu aktualisieren, die nicht vorhanden ist, erhält die Anwendung in der Produktion den Fehler "-346: Fehler beim Aktualisieren einer Zeile in der Tabelle".Der Informix wirft keinen Fehler, wenn er versucht, eine Zeile zu aktualisieren, die nicht vorhanden ist?

Allerdings, wenn wir das gleiche in der Entwicklungsregion versuchen, funktioniert die Anwendung gut.

Ob der Informix Fehler immer beim Aktualisieren einer Zeile, die nicht vorhanden ist, oder ist konfigurierbar auf Informix-Ebene?

Die Anwendung ist in C geschrieben und die entsprechenden Update-Abfragen sind im Programm ".ec" vorhanden.

Gibt es auch eine andere Möglichkeit Informix wirft einen -346 Fehler?

Edit: The SQL is as follows:

update <table> set serial_number = <number1> where serial_number = <number2> 

The SQL Error is:

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 = 

Erneut bearbeiten:

Der Quellcode wird wie folgt dar:

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

Fehler -346 ist kein Problem mit Gegenwart/Abwesenheit. Die Anweisungen von 'finderr -346' sagen _Während der Datenbankserver ein UPDATE verarbeitete, erhielt er einen unerwarteten Fehler . Überprüfen Sie den begleitenden ISAM-Fehlercode für weitere detaillierte Informationen zur Ursache. Mögliche Ursachen sind Hardware-Fehler und Sperrkonflikte._ Sie müssen den ISAM-Fehler ('sqca.sqerrd [1]' in ESQL/C) nachverfolgen, um weitere Informationen zu erhalten. Es sollte eine Fehlernummer mit einem absoluten Wert zwischen 100 und 199 sein. Dies bedeutet wahrscheinlich, dass es ein Problem in Ihrem Produktionssystem gibt. Zeige das SQL. –

+0

Beachten Sie, dass beim Aktualisieren einer nicht vorhandenen Zeile mit einem gesuchten UPDATE einfach null Zeilen aktualisiert werden sollten, die erfolgreich aktualisiert wurden. In einer MODE ANSI-Datenbank würden Sie einen Status von 100 (SQLNOTFOUND) anstelle von 0 (kein Fehler) erhalten. Wenn Sie WHERE CURRENT OF update durchführen und die Zeile nicht mehr vorhanden ist, dann passiert etwas Seltsames - es sollte nicht passieren (weil es bedeutet, dass Sie die Zeile nicht gesperrt haben, als Sie sie ausgewählt haben, sondern jemanden hat es geschafft, die Zeile zu löschen, obwohl sie eigentlich gesperrt sein sollte). Wenn Sie die FOR UPDATE-Klausel nicht verwendet haben, sollte der WHERE CURRENT OF einen spezifischen Fehler aufweisen. –

+0

Danke Jonathan. Ich habe den SQL-Fehler auch aktualisiert. Wir sind nicht sicher, ob unsere Informix DB im ANSI MODE erstellt wird oder nicht. –

Antwort

1

Die Kommentare zu groß werden immer Kommentare zu sein - von einer ganz Marge.

Fehler -346 ist kein Problem mit Gegenwart/Abwesenheit. Die Anweisungen von finderr -346 sagen:

While the database server was processing an UPDATE, it received an unexpected error. Check the accompanying ISAM error code for more detailed information on the cause. Possible causes include hardware errors and locking conflicts.

Sie werden die ISAM-Fehler verfolgen müssen (sqca.sqlerrd [1] in ESQL/C), um weitere Informationen zu erhalten; Es sollte eine Fehlernummer mit einem absoluten Wert zwischen 100 und 199 sein. Dies bedeutet wahrscheinlich, dass es ein Problem in Ihrem Produktionssystem gibt.

Beachten Sie, dass beim Aktualisieren einer nicht vorhandenen Zeile mit einem gesuchten UPDATE einfach null Zeilen aktualisiert werden sollen, die erfolgreich aktualisiert wurden. In einer MODE ANSI-Datenbank würden Sie einen Status von 100 (SQLNOTFOUND) anstelle von 0 (kein Fehler) erhalten. Wenn Sie WHERE CURRENT OF update durchführen und die Zeile nicht mehr vorhanden ist, dann passiert etwas Seltsames - es sollte nicht passieren (weil es bedeutet, dass Sie die Zeile nicht gesperrt haben, als Sie sie ausgewählt haben, sondern jemanden hat es geschafft, die Zeile zu löschen, obwohl sie eigentlich gesperrt sein sollte). Wenn Sie die FOR UPDATE-Klausel nicht verwendet haben, sollte der WHERE CURRENT OF einen spezifischeren Fehler aufweisen.

An diesem Punkt wurde die Frage aktualisiert, um die Fehlerinformationen anzuzeigen.

Curious Nachricht: Ich lief

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; 

, die einen Status von 0 gibt (und Berichte 0 Zeilen aktualisiert). Ihre Nachricht hat -100 als den ISAM-Fehler; Das ist die Nachricht für 'ISAM-Fehler: Duplizierter Wert für einen Datensatz mit eindeutigem Schlüssel'.

Aber wenn ich versuche:

insert into sample values(99, 'ninety-nine'); 
update sample set serial_number = 123 where serial_number = 99; 

ich Fehler:

SQL -268: Unique constraint (jleffler.u160_350) violated. 
ISAM -100: ISAM error: duplicate value for a record with unique key. 

Das ist, was ich erwarten würde.Ich bemerke, dass Sie eine Spalte vom Typ SERIAL (oder SERIAL8 oder BIGSERIAL) nicht direkt aktualisieren können: Sie erhalten SQL -232: A SERIAL column (s) may not be updated (wobei s der Name der seriellen Spalte war, die ich zu aktualisieren versuchte, um die Nachricht zu generieren - es ist kein schlechter Plural in der Botschaft).

Da die primäre Nachricht für den Fehler -346 angibt, dass ein Problem in der Datenbank auftreten könnte, wäre es sinnvoll, ON-Check (oncheck) auf dem System auszuführen, um festzustellen, ob diese Tabelle in Ordnung ist. Wenn Sie ON-Check nicht gewohnt sind, müssen Sie die Optionen nachschlagen. Ich würde wahrscheinlich einige allgemeine Überprüfungen durchführen (z. B. oncheck -cr, um die reservierten Seiten zu überprüfen), bevor ich fortfahre, die Tabelle und die Indizes, in denen das Problem auftritt, zu validieren (oncheck -ci und oncheck -cd). Es kann sich lohnen, die Optionen -cR, -cI, -cD zu verwenden, um weitere Informationen zu erhalten.

+0

Vielen Dank für die ausführliche Erklärung. Ich bin nicht berechtigt, "oncheck" auszuführen und habe um Unterstützung bei DBA gebeten. Ihre Erklärung half dabei, die Botschaft zu vermitteln, wie ernst das Problem sein könnte.Nochmals vielen Dank und ich werde den Fehler aktualisieren, den ich von den obigen Befehlen bekomme. –

+0

Fair genug. Können Sie das Problem mit anderen Tabellen oder nur mit der einen Tabelle wiederholen? Können Sie eine ähnliche Tabelle in der Produktionsdatenbank erstellen und auf das Problem stoßen? –

+0

Ich habe keinen Produktionszugang und kann aufgrund der riesigen Datenmenge nicht viel Forschung und Entwicklung betreiben. In der Entwicklungsregion ist es nicht reproduzierbar. Jedenfalls werde ich morgen den DBA haben und er könnte etwas von deinen Kommentaren finden, hoffe ich. –

Verwandte Themen