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 のレコードが存在するが、データが一致しない場合は、データを更新します。

私はオラクルが初めてです。Java 側から、ID でレコードを選択してそのレコードを更新することは可能ですが、2 つのデータベース呼び出しが行われます。プロシージャを使用してテーブルを更新しようとしていることを避けるためです。同じことが単一のデータベース呼び出しで実行できる場合は、言及してください。

4

3 に答える 3

3

単一の SQL ステートメント ソリューションの場合、この回答https://stackoverflow.com/a/237328/176569で説明されているように、 MERGEステートメントの使用を試みることができます。

例えば

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;
于 2012-10-03T09:46:20.257 に答える
3

手順の代わりに、 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)

これを試して

于 2012-10-03T09:47:46.227 に答える