Проблема с запросом вставки, использующим OCI (c ++) в ORACLE - PullRequest
0 голосов
/ 11 июня 2009

Постановка задачи: - Я вставляю запись в Oracle, если эта запись уже присутствует (дубликат ==> первичный ключ присутствует) в базе данных Я хочу обновить его с новым.

В настоящее время, чтобы решить эту проблему при вставке записи, если я получаю OCI_ERROR, тогда я звоню

OCIErrorGet ((dvoid *) errhp, (ub4) 1, (текст *) NULL, & errcode, errbuf, (ub4) sizeof (errbuf), OCI_HTYPE_ERROR);

Затем я проверяю errbuf, если значение ошибки buf равно ORA-00001 ==> уникальное ограничение нарушено, если оно присутствует, тогда я обновляю значение

Есть ли способ сделать то же самое, кроме поиска записи в базе данных, если эта запись уже существует, обновить ее Я не хочу этого делать, потому что мне придется написать код для этого

Существует ли какая-либо конкретная ошибка, если значение дублируется в ORACLE?

есть предложения?

Ответы [ 3 ]

1 голос
/ 11 июня 2009

вы можете использовать оператор MERGE. Помимо прочего, он позволяет использовать простой UPSERT (фактически он позволяет использовать UPSERT для SET наборов строк, а не только одной строки). Рассмотрим:

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 голосов
/ 04 августа 2012

вы должны использовать #include и использовать пространство имен oracle :: occi;

0 голосов
/ 11 июня 2009

Существует 2 подхода к этой проблеме, и лучший из них зависит от деталей, которые вы не предоставили. Одним из способов будет использование шаблона Repository, представляющего программный слой, который отслеживает объекты и управляет проблемой обновления / вставки, сравнивая объект, который вы предоставляете, с его внутренним хранилищем объектов. Другой (более процедурный) метод - сначала просто запросить объект с данным PK, и, если он существует, использовать обновление, если нет, выполнить вставку.

...