以前select語句中使用的函數,都是SQL內置函數,咱們能夠經過自定義函數更知足咱們的須要。
自定義函數的語法和存儲過程差很少。數據庫
create [or replace] $funtion_name$[(參數..)] return $data_type$ is/as begin return result; [exception]--異常處理 end $funtion_name$; /
注意點:函數
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 觸發器名;
觸發事件:對象
觸發頻率:事件
觸發條件:
NEW和OLD都是參考對象string
OLD 表明原來的數據對象(record)it
insert操做只有NEW, 表明着要插入的新記錄
delete操做只會有OLD,表明着要刪除的該條記錄
update操做NEW 和 OLD 都有io
PS:PLSQL使用的時候須要使用:
,when裏面則不須要使用table
條件量( boolean型 ):
能夠在when語句或者是PLSQL中使用
--示例 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;