2009-06-11 59 views
0

问题描述: - 如果数据库中已存在该记录(存在重复==>主键),我将记录插入到Oracle中 我想更新它与新的一个。插入查询问题ORACLE中的OCI(C++)

如果我得到OCI_ERROR

目前解决这一点的同时插入记录的话,我打电话

OCIErrorGet((dvoid *)errhp,(UB4)1,(文本*)NULL,& ERRCODE,errbuf,(UB4) sizeof(errbuf),OCI_HTYPE_ERROR);

然后我检查errbuf如果errror BUF的值为ORA-00001 ==>违反如果它存在的话,我更新值

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

如果在ORACLE中重复该值,是否会生成任何特定错误?

有什么建议吗?

回答

0

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

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 

i-e:您可以使用相同的语句插入和更新。

干杯,

-
文森特

0

你应该使用的#include和使用命名空间的Oracle :: OCCI;

+0

这与问题有什么关系? – 2012-08-04 20:56:06