2009-06-11 11 views
0

問題文: - データベースにレコードがすでに存在する場合(重複==>主キーが存在する場合)、Oracleにレコードを挿入しています 更新したい新しいものと一緒に。ORACLEのOCI(C++)に問題があります

レコードを挿入しながら現在は、私はOCI_ERRORを得れば、私は

にOCIErrorGet((パラメータはdvoid *)errhpは、(するub4)1、(テキスト*)NULL、& ERRCODE、errbufに、(するub4)を呼び出し、これを解決するためにsizeof(errbuf)、OCI_HTYPE_ERROR); errrorのBUFの値がORA-00001である場合

は、その後、私はもしerrbufをチェックし、それが存在するならば、私は値

を更新違反==>ユニーク制約は、レコードの検索を除いて同じことを行う方法はありますそのレコードが既に存在する場合はデータベースに更新します 私はそのコードを書く必要があるため、これをしたくありません

値がORACLEで複製されている場合、特定のエラーが生成されますか?

提案がありますか?

答えて

0

この問題には2つのアプローチがあり、最適なものは提供しなかった詳細によって決まります。 1つの方法は、リポジトリパターンを使用して、オブジェクトを追跡するソフトウェアレイヤーを導入し、オブジェクトの内部ストアと比較することによって更新/挿入の問題を管理することです。他の(より手続き的な)方法は、指定されたPKを最初に持つオブジェクトを照会するだけです。存在する場合は更新を使用し、そうでない場合は挿入を行います。

1

MERGEステートメントを使用できます。とりわけ、単純なUPSERTを可能にします(実際には、行のSETのUPSERTを許可します)。検討してください:

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:同じステートメントを使用して挿入して更新できます。

乾杯、

から
ヴィンセント

0

あなたがする#includeを使用すると、名前空間のOracleを使用する必要があり:: OCCI。

+0

質問とは何が関係していますか? –

関連する問題