1、觸發器sql
觸發器定義:它是在執行update、delete、insert語句時,執行的一個plsql代碼,它能夠在sql執行前運行,sql執行後運行,也能夠替換掉原有的sql語句。函數
行級觸發器:當表中一條數據發生改變,就會執行一次觸發器代碼。oop
1.表級觸發器使用:不管操做多少次該表,表級觸發器只會觸發一次。 spa
讓觸發器生效/失效:
alter trigger 觸發器名 enable/disable;code
create or replace tigger 名對象
after / before update or delete or insert on 表名;blog
declareio
聲明function
beginclass
執行語句
end;
例:
create or replace TRIGGER tri4 before UPDATE on dept begin if updating THEN dbms_output.put_line('更新'); end if; end;
2.行級觸發器:屢次操做表,屢次觸發
create or replace tigger 名
after/before update or delete or insert on 表名 for each row
declare
聲明
begin
執行
exception
異常處理
end;
例:
CREATE OR REPLACE TRIGGER ti AFTER DELETE ON emp FOR EACH ROW BEGIN dbms_output.put_line('刪除操做'); END;
3.替換觸發器: 該觸發器須要在視圖上使用
create or replace trigger 名
instead of update or delete or insert on 視圖 for each row
deaclare
聲明
begin
執行
exception
異常
end;
例:
--對視圖新增部門,若是有該部門,則修改部門名稱 CREATE OR REPLACE TRIGGER t INSTEAD OF INSERT ON d FOR EACH ROW DECLARE v dept%ROWTYPE; n NUMBER(2);--聲明變量接收數量值用於判斷是否存在該部門 BEGIN SELECT * INTO v FROM dept WHERE deptno = :new.deptno --:new / :old 能夠用來保存刪除的數據 SELECT COUNT(*) INTO n FROM dept WHERE deptno = :new.deptno; IF n = 0 THEN INSERT INTO d VALUES(:new.deptno,:new.dname,:new.loc); ELSE UPDATE d SET dname = :new.dname WHERE deptno = :new.deptno; END IF; EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLERRM); END;
2、包
包:它是將一些功能或業務類似的函數、存儲過程封裝到一塊兒,
統一調用,包含存儲過程、函數、變量、常量等對象
包分爲聲名部分和實現部分(包體),對外只提供包聲名中包含的對象
包的聲名:
create or replace package 包名
is
--聲名類型集合類型,記錄類型、遊標類型等
--聲名變量
變量名 類型名
--聲名常量
常量名 constant 類型名:=常量值;
--聲名存儲過程
procedure 存儲過程名;
--聲名函數
function 函數名 return 返回值類型;
end 包名;
--包名 create or replace package pk1 is --聲名一個常量 PI constant number(10,9):=3.1415926; --聲名一個存儲過程 procedure p1; --聲名一個函數 function f1(r number) return number; end pk1; --包體 create or replace package body pk1 is --私有對象只能在包體的內容使用,並且通常定義在全部公有對象的前面 --聲名私有變量 --私有函數 function f2 return number is begin return 1; end; --私有存儲過程 procedure p2 is begin dbms_output.put_line('Hello World'); end; --存儲過程的實現 procedure p1 is begin p2(); --在包實現中調用的私有對象必須在當前對象的前面定義 for i in 1..9 loop for j in 1..i loop dbms_output.put(i||'*'||j||'='||i*j||' '); if i*j<10 then dbms_output.put(' '); end if; end loop; dbms_output.put_line(''); end loop; end; --函數的實現 function f1(r number) return number is res number(15,5); begin res:=power(r,2)*PI; return res; end; end pk1; --調用 begin dbms_output.put_line(pk1.PI); end; begin pk1.p1; end; begin dbms_output.put_line(pk1.f1(2)); end; begin pk1.p2; --包中私有對象在外部是不可調用的 end;