2009-06-11 15 views
0

Problemstellung: - Ich füge einen Datensatz in Oracle, wenn dieser Datensatz bereits vorhanden ist (Duplikat ==> Primärschlüssel ist vorhanden) in der Datenbank ich möchte es aktualisieren mit neuem.Problem mit der Abfrage Abfrage usjng OCI (C++) in ORACLE

Zeit, dies zu lösen, während die Aufzeichnung einfügen, wenn ich OCI_ERROR erhalten dann nenne ich

OCIErrorGet ((dvoid *) errhp, (UB4) 1, (Text *) NULL, & errcode, errbuf, (UB4) sizeof (errbuf), OCI_HTYPE_ERROR);

Dann prüfe ich errbuf, wenn der Wert des errror buf ist ORA-00001 ==> eindeutige Einschränkung verletzt, wenn es vorhanden ist, dann aktualisieren i den Wert

Gibt es Weg, um die gleiche Sache mit Ausnahme der Suche nach Datensatz zu tun in der Datenbank, wenn dieser Datensatz bereits vorhanden ist, aktualisieren Sie es Ich möchte dies nicht tun, weil ich einen Code dafür schreiben müssen

Gibt es einen bestimmten Fehler generiert, wenn der Wert in ORACLE dupliziert ist?

irgendwelche Vorschläge?

Antwort

0

Es gibt zwei Ansätze für dieses Problem, und das beste hängt von Details ab, die Sie nicht angegeben haben. Eine Möglichkeit wäre, ein Repository-Muster zu verwenden, eine Software-Ebene einzuführen, die Objekte verfolgt, und das Aktualisierungs-/Einfügeproblem zu verwalten, indem das Objekt, das Sie ihm übergeben, mit seinem internen Objektspeicher verglichen wird. Die andere (mehr prozedurale) Methode besteht darin, zuerst nach einem Objekt mit der gegebenen PK zu suchen, und falls es existiert, verwenden Sie eine Aktualisierung, wenn nicht, machen Sie die Einfügung.

1

könnten Sie die MERGE-Anweisung verwenden. Unter anderem ermöglicht es einen einfachen UPSERT (es ermöglicht tatsächlich das UPSERT von SETs von Zeilen und nicht nur einer einzelnen Zeile). Überlegen Sie:

SQL> CREATE TABLE TEST (
    2  ID NUMBER, 
    3  a VARCHAR2(10), 
    4  b VARCHAR2(10), 
    5  CONSTRAINT pk_test PRIMARY KEY (ID) 
    6 ); 

Table created 
SQL> MERGE INTO TEST t 
    2 USING (SELECT 1 ID, 'a' a, 'b' b FROM dual) new_row 
    3  ON (t.id = new_row.id) 
    4 WHEN MATCHED THEN 
    5  UPDATE SET t.a = new_row.a, 
    6    t.b = new_row.b 
    7 WHEN NOT MATCHED THEN 
    8  INSERT (ID, a, b) VALUES (new_row.id, new_row.a, new_row.b); 

Done 
SQL> SELECT * FROM TEST; 

     ID A   B 
---------- ---------- ---------- 
     1 a   b 
SQL> MERGE INTO TEST t 
    2 USING (SELECT 1 ID, 'x' a, 'y' b FROM dual) new_row 
    3  ON (t.id = new_row.id) 
    4 WHEN MATCHED THEN 
    5  UPDATE SET t.a = new_row.a, 
    6    t.b = new_row.b 
    7 WHEN NOT MATCHED THEN 
    8  INSERT (ID, a, b) VALUES (new_row.id, new_row.a, new_row.b); 

Done 
SQL> SELECT * FROM TEST; 

     ID A   B 
---------- ---------- ---------- 
     1 x   y 

i-e: Sie können mit der gleichen Anweisung einfügen und aktualisieren.

Cheers,

-
Vincent

0

Sie #include und mit Namespace Oracle verwenden sollten :: occi;

+0

Was hat das mit der Frage zu tun? –