天天看點

存儲過程、存儲函數、觸發器

存儲過程

存儲過程定義 存儲過程:是一組為了完成特定功能的SQL語句集,經過編譯後存儲在資料庫中,可包含程式流、邏輯以及對資料庫的傳,我們  可以接受參數、輸出參數、傳回單個或者多個結果集以及傳回值。  簡單來講: 在伺服器端,能夠被一個或者多個應用程式調用的一段SQL語句集。

優缺點:        1:存儲過程與其他應用程式共享應用程式邏輯,是以確定了資料通路和修改的一緻性。     2:存儲過程具有安全性和所有權連結,以及可以附加到他們的證書,使用者可以被授予權限來執行存儲過程而不必直接怼存儲  過程中對的引用對象具有權限。     3:存儲過程提供了安全機制,即使是沒有通路存儲過程引用的表或者視圖的權限的使用者,也可以被授權改存儲過程。     4:存儲過程允許子產品化程式設計,存儲過程一旦建立,以後即可在程式中調用任意多次。     5:存儲過程可以減少網絡通訊流量,使用者可以通過發送一個單獨的語句實作一個複雜的操作,而不需要在網絡上發送幾百個Transact-SQL代碼,這樣減少了在伺服器和客戶之間的傳遞和請求的數量。 存儲過程的寫法:     create or replace procedure  過程名(參數名 in 參數類型,參數名 out  參數類型) as 變量名 變量類型 :=值; begin      SQL語句集 end; 注意事項:  * 存儲過程可以沒有參數,如果沒有參數則過程名之後不能出現括号         * 存儲過程可以有參數:          傳入參數用in标明,傳出參數用out标明          可以有多個傳入參數,也可以有多個傳出參數          可以隻有傳入參數,也可以隻有傳出參數        * 存儲過程沒有傳回值,而是通過傳回參數來傳回資料的         * 如果沒有傳入傳出參數,過程名之後不能加() 執行個體 無參數的過程: --實作從1+2+3+......+100的功能 create or replace  procedure pro_test as  x number := 1;  y number := 0; begin  while x<=100 loop  y := y+x;  x := x+1;  end loop;

end;

有參數的過程: --如果傳入參數為1的時候,則傳回歡迎禮貌語句 --如果傳入參數為2的時候,則傳回再見禮貌語句;

create or replace  procedure

 pro_test(key in number,result out varchar) as begin  if key=1 then result :='歡迎您';

 else if key=2 then result :='再見!';  end if;  end if;

end;

存儲過程的調用執行: 1:在cmd中,execute 過程名。 2:declare快調用存儲過程:  declare

  變量 類型:= 初始值;  begin   過程名(參數,變量);  end;

存儲函數

其實存儲函數和存儲過程基本差不多,上面對存儲過程進行了較為詳細的介紹,對存儲函數不多介紹,隻是句式上面少有不同,有傳回結果。

執行個體:

 CREATE OR REPLACE

FUNCTION fn_test(key in number) RETURN  VARCHAR2

AS

    result VARCHAR2(32);

BEGIN

    if key=1 then result := '歡迎您';

               else if key=2 then result := '再見!';

            end if;

          end if;

    RETURN result;

END;

觸發器 (trigger)

介紹:  觸發器其實就是一個特殊的存儲過程   存儲過程:需要調用   觸發器:   自動執行  觸發器中沒有參數  在insert的觸發器中隻能使用new關鍵字 在delete的觸發器中隻能使用old關鍵字  在update的觸發器中可以使用new,也可使用old關鍵字  for each row :行級觸發器的标志   如果沒有這句話則表示每次操作隻執行begin end之間的内容   帶有for  each  row 的觸發器稱為行級觸發器   不帶有for  each  row 的觸發器稱為表級觸發器 觸發器的寫法:  create or replace trigger  觸發器名   before/after    insert/update/delete on 表名   [for each row]  begin   SQL語句集  end; 觸發器的種類:  before insert on 表名 for each row  before update on 表名 for each row  before delete on 表名 for each row  after insert on 表名 for each row  after update on 表名 for each row  after delete on 表名 for each row  before insert on 表名

 before update on 表名

 before delete on 表名  after insert on 表名  after update on 表名  after delete on 表名

案例:  --向test表中插入資料時,将插入的資料存儲到testa表中(資料備份)

 create trigger tri_test

      before insert on test

     for each row

 begin

              insert into testa(id,product,price,type)

             values(new.id,new.product,new.price,new.type);

 end;

也可以在工具中添加(Navicat)  1:在表上右鍵,找到設計表  2:點選觸發器按鈕

存儲過程、存儲函數、觸發器

 (如圖所示,填寫觸發器名稱,在觸發一欄選擇before、after,然後選擇觸發時機插入、更新、删除)  3:定義觸發器

存儲過程、存儲函數、觸發器

 4:儲存結束