初學Oracle PL SQL 筆記四

2021-05-23 03:12:42 字數 3149 閱讀 1631

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 ...