儲存過程,函式跟觸發器

2021-10-09 19:24:44 字數 4516 閱讀 9528

儲存過程和函式是事先經過編譯並儲存在資料庫中的一段 sql 語句的集合,呼叫儲存過程和函式可以簡化應用開發人員的很多任務作,減少資料在資料庫和應用伺服器之間的傳輸,對於提高資料處理的效率是有好處的。

儲存過程和函式的區別在於函式必須有返回值,而儲存過程沒有。

函式 : 是乙個有返回值的過程 ;

過程 : 是乙個沒有返回值的函式 ;

儲存過程

建立儲存過程:

create

procedure procedure_name (

[proc_parameter[,.

..]]

)begin

-- sql語句

end;

示例 :

create

procedure pro_test1(

)begin

select

'hello mysql'

;end

;

呼叫儲存過程:

call procedure_name(

);

檢視儲存過程:

– 查詢db_name資料庫中的所有的儲存過程

select name from mysql.

proc

where db=

'db_name'

;

– 查詢儲存過程的狀態資訊

show

procedure

status

;

– 查詢某個儲存過程的定義

show

create

procedure test.pro_test1 \g;

刪除儲存過程:

drop

procedure[if

exists

] sp_name ;

儲存過程是可以程式設計的,意味著可以使用變數,表示式,控制結構 , 來完成比較複雜的功能。

通過 declare 可以定義乙個區域性變數,該變數的作用範圍只能在 begin…end 塊中:

create

procedure pro_test2(

)begin

declare num int

default5;

select num+10;

end;

直接賦值使用 set,可以賦常量或者賦表示式:

create

procedure pro_test3(

)begin

declare name varchar(20

);set name =

'mysql'

;select name ;

end;

也可以通過select … into 方式進行賦值操作 :

create

procedure pro_test5(

)begin

declare countnum int

;select

count(*

)into countnum from city;

select countnum;

end;

語法結構:

create

function function_name(

[param type..

.])returns

type

begin..

.end

;

例:定義乙個儲存過程, 請求滿足條件的總記錄數 ;

create

function count_city(countryid int

)returns

intbegin

declare cnum int

;select

count(*

)into cnum from city where country_id = countryid;

return cnum;

end;

呼叫:

select count_city(1)

;

觸發器是與表有關的資料庫物件,指在 insert/update/delete 之前或之後,觸發並執行觸發器中定義的sql語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性 , 日誌記錄 , 資料校驗等操作 。

建立觸發器

語法結構 :

create

trigger trigger_name

before/

after

insert

/update

/delete

on tbl_name

[for each row

]-- 行級觸發器

begin

trigger_stmt ;

end;

示例: 通過觸發器記錄 emp 表的資料變更日誌 , 包含增加, 修改 , 刪除 ;

建立 insert 型觸發器,完成插入資料時的日誌記錄 :

create

trigger emp_logs_insert_trigger

after

insert

on emp

for each row

begin

insert

into emp_logs (id,operation,operate_time,operate_id,operate_params)

values

(null

,'insert'

,now()

,new.id,concat(

'插入後(id:'

,new.id,

', name:'

,new.name,

', age:'

,new.age,

', salary:'

,new.salary,

')'));

end;

建立 update 型觸發器,完成更新資料時的日誌記錄 :

create

trigger emp_logs_update_trigger

after

update

on emp

for each row

begin

insert

into emp_logs (id,operation,operate_time,operate_id,operate_params)

values

(null

,'update'

,now()

,new.id,concat(

'修改前(id:'

,old.id,

', name:'

,old.name,

',age:'

,old.age,

', salary:'

,old.salary,

') , 修改後(id'

,new.id,

'name:'

,new.name,

',age:'

,new.age,

', salary:'

,new.salary,

')'));

end;

建立delete 行的觸發器 , 完成刪除資料時的日誌記錄 :

create

trigger emp_logs_delete_trigger

after

delete

on emp

for each row

begin

insert

into emp_logs (id,operation,operate_time,operate_id,operate_params)

values

(null

,'delete'

,now()

,old.id,concat(

'刪除前(id:'

,old.id,

', name:'

,old.name,

',age:'

,old.age,

', salary:'

,old.salary,

')'));

end;

刪除觸發器:

drop

trigger

[schema_name.

]trigger_name

如果沒有指定 schema_name,預設為當前資料庫 。

檢視觸發器:

show triggers ;

觸發器,儲存過程,函式區別

觸發器是特殊的儲存過程,儲存過程需要程式呼叫,而觸發器會自動執行 你所說的函式是自定義函式吧,函式是根據輸入產生輸出,自定義只不過輸入輸出的關係由使用者來定義。在什麼時候用觸發器?要求系統根據某些操作自動完成相關任務,比如,根據買掉的產品的輸入數量自動扣除該產品的庫存量。什麼時候用儲存過程?儲存過程...

Oracle儲存過程,函式,觸發器

一 儲存過程的定義 1 過程 多次編譯 多次執行 過程實現計算器 declare p1 number 1 p2 number 2 sign varchar2 3 begin if sign then syso p1 p2 elsif sign then syso p1 p2 elsif sign t...

觸發器 函式或儲存過程

觸發器是一種特殊型別的儲存過程,主要是通過事件進行觸發被自動呼叫執行的。而普通儲存過程可以通過儲存過程的名稱被呼叫。觸發器對錶進行插入 更新 刪除的時候會自動執行的特殊儲存過程。觸發器一般用在check約束更加複雜的約束上面。觸發器和普通的儲存過程的區別是 觸發器是當對某乙個表進行操作。諸如 upd...