2012-10-03 78 views
2

我有一個表甲骨文插入或通過程序

CREATE TABLE STUDENT 
(
    ID   INTEGER PRIMARY KEY, 
    FIRSTNAME  VARCHAR2(1024 CHAR), 
    LASTNAME  VARCHAR2(1024 CHAR), 
    MODIFIEDDATE DATE DEFAULT sysdate 
) 

我插入數據

insert into STUDENT (ID, FIRSTNAME, LASTNAME, MODIFIEDDATE) values (1,'Scott', 'Tiger', sysdate); 

當我要插入數據的記錄的行更新一排,我需要編寫一個程序或功能,執行以下操作:

  1. 如果沒有記錄爲相同的ID插入行。
  2. 如果有相同的id和數據匹配的記錄,則什麼都不做。
  3. 如果存在相同ID的記錄但數據不匹配,則更新數據。

我是oracle新手。從java結束,可以通過id選擇記錄,然後更新該記錄,但這會進行2次數據庫調用。只是爲了避免我正在嘗試使用過程更新表。如果同一個數據庫調用可以完成,請提及。

回答

2

對於單個的SQL語句的解決方案,你可以嘗試使用MERGE語句,在這個答案https://stackoverflow.com/a/237328/176569

例如描述

create or replace procedure insert_or_update_student(
p_id number, p_firstname varchar2, p_lastname varchar2 
) as 
begin 
    merge into student st using dual on (id = p_id) 
     when not matched then insert (id, firstname, lastname) 
      values (p_id, p_firstname, p_lastname) 
     when matched then update set 
      firstname = p_firstname, lastname = p_lastname, modifiedate = SYSDATE 
end insert_or_update_student; 
+1

的過程是不是絕對必要的;所有的程序都需要從一個JDBC調用中執行多個DML操作。從JDBC直接使用合併語句是好的。 –

+0

這是真的科林,並感謝編輯 – bpgergo

+1

一些開發人員 - 最着名的是史蒂芬Feuerstein - 喜歡包裝*存儲過程中的所有*數據庫訪問。我不想:我把關係模型當作我的「界面」。 –

2

而不是程序嘗試在oracle中使用合併。 如果值匹配,將更新的表,如果沒有找到值,它會插入值

MERGE INTO bonuses b 
USING (
    SELECT employee_id, salary, dept_no 
    FROM employee 
    WHERE dept_no =20) e 
ON (b.employee_id = e.employee_id) 
WHEN MATCHED THEN 
    UPDATE SET b.bonus = e.salary * 0.1 
    DELETE WHERE (e.salary < 40000) 
WHEN NOT MATCHED THEN 
    INSERT (b.employee_id, b.bonus) 
    VALUES (e.employee_id, e.salary * 0.05) 
    WHERE (e.salary > 40000) 

試試這個

0

爲了解決第二個任務 - 「如果有一個相同的記錄ID和數據匹配,然後什麼都不做。「 - 從10g開始,我們在更新和插入合併運算符的部分中增加了「where」子句。 要做到,我們可以添加一些檢查的數據更改的任務:

when matched then update 
     set student.last_name = query.last_name 
      where student.last_name <> query.last_name 

這將更新只匹配的行,只爲行,其中數據被改變