儲存過程和函式是事先經過編譯並儲存在資料庫中的一段 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...