[英]Problem with insert query usjng OCI(c++) in ORACLE
问题陈述:-如果数据库中已经存在该记录(重复键==>主键),我正在向Oracle中插入一条记录,我想用新记录更新它。
当前解决此问题,同时插入记录,如果我收到OCI_ERROR,然后我打电话
OCIErrorGet((dvoid *)errhp,(ub4)1,(text *)NULL,&errcode,errbuf,(ub4)sizeof(errbuf),OCI_HTYPE_ERROR);
然后我检查errbuf是否errror 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
即:您可以使用同一条语句插入和更新。
干杯,
-
文森特
您应该使用#include并使用命名空间oracle :: occi;
有两种解决方法,最好的一种取决于您未提供的详细信息。 一种方法是使用存储库模式,引入一个跟踪对象的软件层,并通过将您提供给它的对象与其内部对象存储进行比较来管理更新/插入问题。 另一种(更具过程性的)方法只是先查询具有给定PK的对象,如果存在,则使用更新,否则,执行插入操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.