0

問題の説明:- そのレコードがデータベースに既に存在する (重複 ==> 主キーが存在する) 場合、そのレコードを Oracle に挿入しています。新しいレコードで更新したいと考えています。

現在、OCI_ERRORを取得した場合にレコードを挿入するときにこれを解決するために、呼び出します

OCIErrorGet( (dvoid *)errhp, (ub4) 1, (テキスト *) NULL, &errcode,errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);

次に、エラー buf の値が ORA-00001 であるかどうか errbuf をチェックします ==> 存在する場合は一意の制約に違反し、値を更新します

そのレコードが既に存在する場合、データベース内のレコードを検索する以外に同じことを行う方法はありますか?

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

助言がありますか?

4

3 に答える 3

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

つまり、同じステートメントを使用して挿入と更新を行うことができます。

乾杯、

--
ヴィンセント

于 2009-06-11T14:23:31.837 に答える
0

#include と using namespace oracle::occi; を使用する必要があります。

于 2012-08-04T10:43:40.997 に答える
0

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

于 2009-06-11T14:00:59.753 に答える