2009-06-11 6 views
0

Problème: - J'insère un enregistrement dans Oracle si cet enregistrement est déjà présent (dupliquer ==> clé primaire est présent) dans la base de données Je veux le mettre à jour avec un nouveau.Problème avec la requête d'insertion usjng OCI (C++) dans ORACLE

Actuellement pour résoudre ce tout en insérant le disque si je reçois oci_error alors j'appelle

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

Ensuite je vérifie errbuf si la valeur du buf errror est ORA-00001 ==> contrainte unique bafouée si elle est présente alors mettre à jour la valeur

Y at-il moyen de faire la même chose, sauf la recherche d'enregistrement dans la base de données si cet enregistrement est déjà présent le mettre à jour Je ne veux pas faire cela parce que je vais devoir écrire un code pour cela

Y at-il une erreur spécifique générée si la valeur est dupliquée dans ORACLE?

des suggestions?

Répondre

0

Il y a 2 approches à ce problème, et la meilleure dépend de détails que vous n'avez pas fournis. Une façon serait d'utiliser un modèle Repository, en introduisant une couche logicielle qui suit les objets, et gère le problème de mise à jour/insertion en comparant l'objet que vous lui donnez à son magasin interne d'objets. L'autre méthode (plus procédurale) consiste simplement à interroger un objet avec le PK donné en premier, et s'il existe, utilisez une mise à jour, sinon, faites l'insertion.

1

vous pouvez utiliser l'instruction MERGE. Entre autres, il permet un simple UPSERT (il permet en fait l'UPSERT de SETs de lignes et pas seulement une seule ligne). Considérez:

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: Vous pouvez insérer et mettre à jour en utilisant la même instruction.

Cheers,

-
Vincent

0

vous devez utiliser #include et en utilisant Oracle namespace :: occi;

+0

Qu'est-ce que cela a à voir avec la question? –