问题陈述:- 如果数据库中已经存在该记录(重复 ==> 存在主键),我将向 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/