1.觸發器:
create [or reaplace] trigger trigger_name
triggering_event on table_name
[follows another_trigger]
[enable/disable]
[when condition]
declare
declaration statements
begin
executable statements
exception
exception-handing statements
end;
before 或者 after 指明何時觸發器執行,即在觸發事件發生之前,還是之後。
子句for each row 指定行觸發器,只適用於所插入、修改或者刪除的資料行。
使用follows 選項,可以指定觸發器被觸發的順序,這個選項適用於在相同 表上所定義的,並且在相同時間點會執行的觸發器。
如不使用 [enable / disable ] 子句 , 為禁用或啟用觸發器,需要執行alter trigger 命令:
alter trigger trigger_name disable/enable;
如果刪除乙個表,則在該錶上所定義的資料庫觸發器也會被刪除。觸發器是定義於資料庫表的。
不允許在觸發器體中宣告long 或者 long raw 變數。
例如 :
create or replace trigger student_bi
before insert on student
for each row
begin
:new.student_id := student_id_seq.nextval;
:new.created_by := user;
:new.created_date :=sysdate;
:new.modified_by := user;
:new.modified_date := sysdate;
end;
觸發器體中包含偽記錄::new,使得你可以訪問當前正在被處理的資料行。:new 偽記錄是一種triggering_table%type,所以在這種情況下,這是student%type的型別。為訪問偽記錄:new 的單獨成員,需要使用點符號。
create or replace trigger instructor_aud
after update or delete on instructor
declare
v_type varchar2(10);
begin
if updating then
v_type := 'update';
elsif deleting then
v_type := 'delete';
end if;
update statistics
set transaction_user=user,
transaction_date=sysdate
where table_name = 'instructor' and transaction_name=v_type;
if sql%notfound then
insert into statistics
values('instructor',v_type,user,sysdate);
end if;
end;
create trigger student_au
after update on student
for each row
when (nvl(new.zip,' ') <> old.zip )
update student
set zip='01247' where zip='02189'
使用偽記錄:old 可以訪問當前被處理的資料行。 當在when 語句 的條件中使用時,:new 和:old 都不再使用冒號作為字首 。
:new 標識被更新的值,:old 標識被更新之前的那個值。所以:zip列的值01247 是個新值,用:new.zip 來引用它。02189 是zip 列的先前值,使用:old.zip 來引用。
create or replace trigger instructor_biud
defore insert or update or delete on instructor
declare
v_day varchar2(10);
begin
v_day := rtrim(to_char(sysdate, 'day' ));
if v_day like ('s%') then
end if;
end;
建立針對 檢視(view) 的 instead of 觸發器
create view student_address as
select s.student_id, s.first_name, s.last_name, s.street_address, z.city, z.state, z.zip
from student s join zipcode z on (s.zip= z.zip );
create or replace trigger student_address_ins
instead of insert on student_address
for each row
begin
insert into student
(student_id,first_name,last_name,street_address,zip,registration_date,created_by,created_date,
modified_by,modified_date)
values(:new.student_id , :new.first_name, :new.last_name,:new.street_address,
:new.zip, sysdate, user , sysdate , user, sysdate );
end;
Oracle PL SQL學習筆記
游標分類 游標概念 與游標相關的語法型別 建立游標 如同宣告任何其他變數一樣 cursor cursor name is sql statement 開啟與關閉游標 開啟游標 open cursor arg arg 關閉游標 close cursor 取資料 fetch cursor into va...
Oracle PL SQL 學習筆記
一 pl sql 塊 塊定義語法 declare 定義部分 定義常量 變數 複雜資料型別 游標 begin 執行部分 pl sql語句和sql語句 exception 異常處理部分 處理執行錯誤 end 注 pl sql中結束輸入使用 字元 dbms output.put line 輸出的字串內容 ...
Oracle PL SQL 學習筆記(四)
3.2定義並使用變數 pl sql資料型別 標量 scalar 型別 復合 composite 型別 參照 reference 型別和lob larger object 型別。3.2.1標量變數 1.常用標量型別 1 varchar2 n 定義可變長度的字串,長度 4000位元組 2 char n ...