2009-06-11 71 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