2016-04-03 19 views
0

Oracle環境(SQLPLUSを使用)。私の質問は、新しく挿入されたタプルのデータを変更する方法です。 ここでは例を示します。属性 "weight"が100より大きい場合、その別の属性 "size_level"は1でなければなりません。そうでなければ(< = 100)、 size_levelは0にする必要があります。 これを行うために、私はストアドプロシージャを呼び出す必要があると考えました。トリガから呼び出されたSQLプロシージャ

CREATE OR REPLACE TRIGGER new_ship_trigger 
AFTER INSERT ON Orders 
FOR EACH ROW 
BEGIN ATOMIC 
    CALL UpdateShipSizeLevel(:new) 
END; 
/

ストアドプロシージャの部分のコードはどのように書くべきですか?または、カーソルが必要なのでしょうか? "Orders"テーブルに制約を追加しないでください。複数のトリガーを使用する必要はありません。

+0

これは正しいですが、これは正しいです... – Codexer

+0

@zagglerはい、あります。 – tic30

+5

1)しばしば、テーブルにヒットする前に値を変更または追加するために使用できる 'BEFORE INSERT'トリガを行うことができます。 2)また、 'size_level'は_derived_情報です。通常は保存しないでください(避けることができれば)。それをビューの一部として定義できるだけかもしれません。それ以外の場合は、パフォーマンスが必要な場合は、計算列を考慮してください。 –

答えて

1

もう1つのOracleトリガーの例があります。また、必ず読んでください。 PL/SQL Triggers

create table so54b (
id number 
,weight number 
,weight_level number 
); 

create or replace trigger so54b_trg 
-- note the trigger is also run in update 
before insert or update on so54b 
for each row 
begin 
    -- you don't need to implement the trigger logic in a separate 
    -- subroutine. however sometimes it might make sense. 
    :new.weight_level := 
    case 
     when :new.weight > 100 then 1 
     else 0 
    end; 
end; 
/
show errors 

insert into so54b(id, weight) values (1, 99); 
insert into so54b(id, weight) values (2, 100); 
-- weight_level is overwritten by the trigger 
insert into so54b(id, weight, weight_level) values (3, 101, 13); 

select * from so54b order by id; 

     ID  WEIGHT WEIGHT_LEVEL 
---------- ---------- ------------ 
     1  99    0 
     2  100    0 
     3  101    1 


update so54b set weight = 80 where weight > 100; 

select * from so54b order by id; 

     ID  WEIGHT WEIGHT_LEVEL 
---------- ---------- ------------ 
     1   99   0 
     2  100   0 
     3   80   0 
+0

ありがとうございます。できます。私は後にする代わりに前に使用する必要があります。 – tic30

関連する問題