自定義函式是一種與儲存過程十分相似的過程式資料庫物件。它與儲存過程一樣,都是由 sql 語句和過程式語句組成的**片段,並且可以被應用程式和其他 sql 語句呼叫。
自定義函式與儲存過程之間存在幾點區別:
可以使用 create function 語句建立自定義函式。
語法格式如下:
create function 《函式名》 ( [ 《引數1> 《型別1> [ , 《引數2> 《型別2>] ] … )
returns 《型別》
《函式主體》
語法說明如下:
在 return value 語句中包含 select 語句時,select 語句的返回結果只能是一行且只能有一列值。
mysql> create function stunamebyid()
-> returns varchar(45)
-> return
-> (select name from tb_students_info
-> where id=1);
query ok, 0 rows affected (0.09 sec)
【例項 2】呼叫自定義函式 stunamebyid,檢視函式的執行結果,如下所示。
mysql> select stunamebyid();
可以使用 alter function 語句來修改自定義函式的某些相關特徵。若要修改自定義函式的內容,則需要先刪除該自定義函式,然後重新建立。
自定義函式被建立後,一直儲存在資料庫伺服器上以供使用,直至被刪除。刪除自定義函式的方法與刪除儲存過程的方法基本一樣,可以使用 drop function 語句來實現。
語法格式如下:
drop function [ if exists ] 《自定義函式名》
在 mysql 中,伺服器處理 sql 語句預設是以分號作為語句結束標誌的。然而,在建立儲存過程時,儲存過程體可能包含有多條 sql 語句,這些 sql 語句如果仍以分號作為語句結束符,那麼 mysql 伺服器在處理時會以遇到的第一條 sql 語句結尾處的分號作為整個程式的結束符,而不再去處理儲存過程體中後面的 sql 語句,這樣顯然不行。為解決這個問題,通常可使用 delimiter 命令將結束命令修改為其他字元。
mysql> delimiter //
mysql> delimiter //
mysql> create procedure showstuscore()
-> begin
-> select * from tb_students_score;
-> end //
query ok, 0 rows affected (0.09 sec)
mysql> delimiter //
mysql> create procedure getscorebystu
-> (in name varchar(30))
-> begin
-> select student_score from tb_students_score
-> where student_name=name;
-> end //
query ok, 0 rows affected (0.01 sec)
建立儲存過程 getscorebystu 後,通過 call 語句呼叫該儲存過程的 sql 語句和執行結果如下所示。
mysql> delimiter ;
mysql> call getscorebystu('green');
+---------------+
| student_score |
+---------------+
| 99 |
+---------------+
1 row in set (0.03 sec)
query ok, 0 rows affected (0.03 sec)
修改儲存過程的內容可以通過刪除原儲存過程,再以相同的命名建立新的儲存過程。
drop [ if exists ] 《過程名》
mysql 資料庫中觸發器是乙個特殊的儲存過程,不同的是執行儲存過程要使用 call 語句來呼叫,而觸發器的執行不需要使用 call 語句來呼叫,也不需要手工啟動,只要乙個預定義的事件發生就會被 mysql自動呼叫。
在 mysql 中,只有執行 insert、update 和 delete 操作時才能啟用觸發器。
在實際使用中,mysql 所支援的觸發器有三種:insert 觸發器、update 觸發器和 delete 觸發器。
mysql> create trigger sumofsalary
-> before insert on tb_emp8
-> for each row
-> set @sum=@sum+new.salary;
query ok, 0 rows affected (0.35 sec)
set @sum=0;
query ok, 0 rows affected (0.05 sec)
mysql> insert into tb_emp8
-> values(1,'a',1,1000),(2,'b',1,500);
query ok, 2 rows affected (0.09 sec)
records: 2 duplicates: 0 warnings: 0
mysql> select @sum;
+------+
| @sum |
+------+
| 1500 |
+------+
1 row in set (0.03 sec)
注意:刪除乙個表的同時,也會自動刪除該錶上的觸發器。另外,觸發器不能更新或覆蓋,為了修改乙個觸發器,必須先刪除它,再重新建立。
使用 drop trigger 語句可以刪除 mysql 中已經定義的觸發器。
【例項】刪除 double_salary 觸發器,輸入的 sql 語句和執行過程如下所示。
mysql> drop trigger double_salary;query ok, 0 rows affected (0.03 sec)
mysql儲存過程 儲存函式 觸發器 事件
前言 資料庫本身支援儲存過程,不同的資料庫管理系統對儲存過程的支援都不盡相同 從mysql5.0開始,mysql支援儲存過程 儲存函式 觸發器 事件 使用儲存過程的優點 儲存過程執行一次後,其執行的規劃就駐留在高速緩衝儲存器上,以後再次呼叫儲存過程時,只需從高速緩衝儲存器中呼叫以編譯好的二進位制 執...
mysql儲存過程,函式,觸發器例子
1,分割乙個用 間隔的字串的儲存過程 create procedure sp insertjoke lastindex int begin declare i int set i 1 while i0 do begin set part1 mid a,1,p 1 insert myjoke cont...
MySQL 事件 觸發器 儲存過程
事件 檢視事件狀態 show variables like event scheduler 開啟事件 set global event scheduler on 觸發器語法 建立觸發器 delimiter 定義開始和結束的標誌 create trigger triggername after bef...