0

问题陈述:- 如果数据库中已经存在该记录(重复==>主键存在),我将向 Oracle 中插入一条记录,我想用新记录更新它。

目前在插入记录时解决这个问题,如果我得到 OCI_ERROR 然后我打电话

OCIErrorGet( (dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);

然后我检查 errbuf 错误 buf 的值是否为 ORA-00001 ==> 如果存在违反唯一约束然后我更新值

有没有办法做同样的事情,除了在数据库中搜索记录,如果该记录已经存在更新它我不想这样做,因为我将不得不为此编写代码

如果值在 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 并使用命名空间 oracle::occi;

于 2012-08-04T10:43:40.997 回答
0

有两种方法可以解决这个问题,最好的方法取决于您未提供的详细信息。一种方法是使用存储库模式,引入一个跟踪对象的软件层,并通过将您提供给它的对象与其内部对象存储进行比较来管理更新/插入问题。另一种(更程序化的)方法是首先查询具有给定 PK 的对象,如果存在,则使用更新,如果不存在,则执行插入。

于 2009-06-11T14:00:59.753 回答