MYSQL函式 儲存過程 觸發器

2021-09-13 15:13:47 字數 3209 閱讀 9069

自定義函式是一種與儲存過程十分相似的過程式資料庫物件。它與儲存過程一樣,都是由 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...