pl/sql基礎之三

1、觸發器sql

  • 觸發器定義:它是在執行update、delete、insert語句時,執行的一個plsql代碼,它能夠在sql執行前運行,sql執行後運行,也能夠替換掉原有的sql語句。函數

  • 行級觸發器:當表中一條數據發生改變,就會執行一次觸發器代碼。oop

  • 語句級觸發器(表級):當執行一條sql語句,無論理sql語句改變了表中的多少條數據,只會執行一次觸發器代碼。

1.表級觸發器使用:不管操做多少次該表,表級觸發器只會觸發一次。   spa

      讓觸發器生效/失效:
            alter trigger 觸發器名 enable/disable;code

  create or replace tigger  名對象

  after / before  update or delete or insert on 表名;blog

  declareio

  聲明function

  beginclass

  執行語句

  end;

 

  1. updating:布爾類型變量,若是是update語句它返回true,不然返回false
  2. deleting:布爾類型變量,若是是delete語句它返回true,不然返回false
  3. inserting:布爾類型變量,若是是insert語句它返回true,不然返回false

例:

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;
相關文章
相關標籤/搜索