oracle學習筆記(二十) 子程序——函數與觸發器

子程序——函數

語法

以前select語句中使用的函數,都是SQL內置函數,咱們能夠經過自定義函數更知足咱們的須要。
自定義函數的語法和存儲過程差很少。數據庫

create [or replace] $funtion_name$[(參數..)]
    return $data_type$
    is/as
    begin
        return result;
        [exception]--異常處理
    end $funtion_name$;
/

注意點:函數

  • 函數只能接收參數模式只能是in,默認不寫便可
  • 函數參數和返回結果的類型只能是SQL的標準類型,PL/SQL特有類型不可以使用(如boolean,string..)

使用自定義函數

SQL函數都是在select語句中使用,這也是函數與存儲過程過程的區別日誌

--編寫一個函數得到指定部門的平均工資。
create or replace function avg_sal(p_deptno employee.sal%type)
    return employee.sal%type
    is
        v_avg_sal employee.sal%type;
    begin
        select avg(nvl(sal,0) into v_avg_sal from employee where deptno=p_deptno;
        return v_avg_sal;
    end avg_sal;
/
--select語句使用
select dname,avg_sal(deptno) from department;

觸發器

觸發器,當知足某種事件時候系統會自動執行(隱式執行)code

語法

create or replace trigger 觸發器名
   觸發時間(BEFORE|AFTER)  觸發事件(INSERT OR UPDATE OR DELETE) [OF 列名] ON 觸發對象(表、視圖等)
      觸發頻率[for each row] --沒有for each row的話默認爲語句級觸發器
         when (觸發條件) 
declare
   --聲明變量部分
begin
   --執行部分
end 觸發器名;

說明

觸發事件:對象

  • DML語句(INSERT, UPDATE, DELETE語句對錶或視圖執行數據處理操做)、
  • DDL語句(如CREATE、ALTER、DROP 語句在數據庫中建立、修改、刪除模式對象)、數據庫系統事件(如系統啓動或退出、異常錯誤)、
  • 用戶事件(如登陸或退出數據庫)

觸發頻率:事件

  • 語句級 語句結束,觸發器結束,只執行一次
  • 行級 每行又知足觸發器條件,都會執行一次觸發器

觸發條件:
NEW和OLD都是參考對象string

  • NEW 表明新的數據對象(record)
  • OLD 表明原來的數據對象(record)it

    insert操做只有NEW, 表明着要插入的新記錄
    delete操做只會有OLD,表明着要刪除的該條記錄
    update操做NEW 和 OLD 都有io

PS:PLSQL使用的時候須要使用:,when裏面則不須要使用table

條件量( boolean型 ):
能夠在when語句或者是PLSQL中使用

  • inserting: 表明作的是insert操做
  • updating: 表明作的是update操做
  • deleting: 表明作的是delete操做

例子

--示例 1:當向employee插入數據時自動填充(生成)主鍵值,(使用序列)
create or replace trigger trg_auto_generate_pk
    before insert on employee
    for each row --行級觸發器,每一行知足條件觸發
        when(NEW.empno is null) --當插入的數據主鍵爲空,自動生成,NEW表示當前INSERT的數據,不須要使用:
declare
    empno number;
begin
    --以前建立的序列
    select emp_seq.nextval into empno from dual;
    if inserting then
     :NEW.empno := empno;--使用:引用
    end if;
end trg_auto_generate_pk;
/

/*
示例 2:當刪除數據時,自動備份
a. 建立備份表
b. 建立觸發器
*/
--這裏也能夠使用動態SQL建立表
--建立備份表,只複製結構,不復制數據
create table employee_dump
 as select * from employee where 1=2;
 
--建立觸發器
create or replace trigger trg_backup_employee
  after delete on employee
    for each row
      when(OLD.empno is not null)
declare
begin
  insert into employee_dump values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
  commit;
  exception 
    when others then
      null; --還能夠把異常的信息插入到日誌表
end trg_backup_employee;
/

--禁用觸發器:disable
alter trigger trg_backup_employee disable;

--啓用觸發器:enable
alter trigger trg_backup_employee enable;

--禁用某個表上全部的觸發器:disable all triggers;
alter table employee disable all triggers;

--刪除觸發器
drop trigger trg_backup_employee;
相關文章
相關標籤/搜索