c++ - 在 ORACLE 中使用 OCI(c++) 插入查询的问题

标签 c++ oracle oracle-call-interface ora-00001

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

目前在插入记录时解决这个问题,如果我得到 OCI_ERROR,那么我调用

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

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

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

ORACLE中重复值是否会产生特定的错误?

有什么建议吗?

最佳答案

您可以使用 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:您可以使用相同的语句插入和更新。

干杯,

--
文森特

关于c++ - 在 ORACLE 中使用 OCI(c++) 插入查询的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/981241/

相关文章:

c# - 在windows 8.1(通用应用程序)中解码mp3

java.sql.SQLException : sql injection violation, 拒绝对象:dbms_random

c++ - stoi和std::to_string on mingw 4.7.1 [duplicate]

c++ - 如何从 pqxx 调用重载的远程过程

c++ - 检测输入中的整数溢出

oracle - 在多个 pl/sql 调用中部分使用游标而不在包规范中定义它

javascript - 如何使用 JavaScript 将静态值作为列表中的第一个值? ORACLE APEX - LOV 列表

oracle-call-interface - SQuirreL SQL 中缺少 Oracle OCI 和 Thin 驱动程序

c++ - 如何检测 Oracle 断开/停止的连接?

c - ocilib 的稳定性如何