MySQL自定義函式 觸發器 儲存過程

2022-08-21 16:42:16 字數 3226 閱讀 9912

儲存過程,是乙個資料庫物件,類似乙個函式。

在儲存過程中可以使用sql中的絕大部分內容,並且可以加入程式語言的特性(迴圈判斷分支)。

編寫好儲存過程之後,可以在客戶端呼叫儲存過程,儲存過程會自動的執行裡面的一系列**

在儲存過程中使用ddl/dml/tcl 和普通sql一樣,dql和普通sql略有區別。

create procedure 過程名稱([引數列表])

begin

sql語句

end;

--引數列表的宣告規範:引數的輸入、輸出型別 引數名稱 引數的型別;過個引數之間用逗號分隔

--引數的輸入/輸出型別

1. in型別 外界資料傳遞給儲存過程

2. out型別 可以把儲存過程中的資料返回給外界呼叫者

3. inout型別 既可以傳入 又可以傳出

-- 建立乙個儲存過程,查詢emp表中的資料總數並返回結果

-- 注意:宣告過程中需指明引數型別,但是沒有引數長度的指定

create procedure func1(out total int)

begin

-- 把查詢結果賦值給out型別的引數 select .. into .. from ..

-- 通過out型別引數將結果返回給呼叫者

select count(1) into total from emp;

end;

create definer=`root`@`localhost` procedure `func1`(out total int)

begin

-- 把查詢結果賦值給out型別的引數

-- 通過out型別引數將結果返回給呼叫者

select count(1) into total from emp;

end;

-- 呼叫義好的儲存過程,就像呼叫函式一樣

call func1(@total); -- 呼叫儲存過程,通過@total給儲存過程傳遞乙個out型別引數

select @total; -- 儲存過程通過out型別引數返回結果,查詢out型別引數獲取儲存過程的執行結果

drop procedure func1;
-- 建立儲存過程 返回兩個數相加的結果

-- 如果沒有指明引數的輸入輸出型別,預設為in型別

create procedure func2(num1 int,num2 int,out res int)

begin

-- 把num1+num2的結果賦值給res

set res = num1+num2;

end;

-- 呼叫儲存過程,查詢結果,引數名字並不一定與定義的引數名一樣

call func2(10,20,@re);

select @re; --30

不能移植無法移植 在不同資料庫中,儲存過程語法不同

不能移植一旦使用儲存過程 將無法移植

不能移植除非不考慮移植 才使用儲存過程

面試問到就說沒用過,因為專案考慮資料移植性

-- 定義乙個函式

create function f007(arg1 int, arg2 int)

returns int

begin

declare result int default 0;

set result = arg1 + arg2;

return(result);

end ;

-------------------------------呼叫函式--------------

select f007(1,5);

函式必須有返回值

函式中不能使用sql

當對某張表做dml操作時,可以使用觸發器自定義關聯行為。

觸發器用於在資料庫的dml操作之前/之後執行某些操作

觸發器trigger的定義語法

-- 在tab1表中建立乙個觸發器trig1 在每一行資料插入之前/之後 do something

create trigger trig1 before/after insert on tab1 for each row

begin

--do something

end;

new關鍵字 代表新資料new.name獲取新資料的name值

old關鍵字 代表老資料

-- 在emp_bak中建立觸發器t1,每次往emp_bak插入資料之前

create trigger t1 before insert on emp_bak for each row

begin

-- 執行往emp_bak1表插入相同的資料 new代表新資料

insert into emp_bak1(empno,ename)values(new.empno,new.ename);

end;

-- 測試

insert into emp_bak(empno,ename)values(2234,"張三");

-- 在emp_bak中建立觸發器t2,每次update emp_bak資料之後

create trigger t2 after update on emp_bak for each row

begin

-- 在emp_bak1表中執行相同的操作 old代表老資料

update emp_bak1 set ename = new.ename where ename=old.name;

end;

-- 測試

update emp_bak set ename="張三丰" where ename="張三";

不推薦使用檢視和觸發器

檢視 在開發環境怎麼折騰都沒問題 但是用於生產環境時檢視想變動就難了

終止符定義,預設是;

delimiter \\將終止符定義為\\

儲存過程,自定義函式,觸發器,游標

儲存過程 概念儲存過程就是一組用來實現乙個任務的sql語句集。儲存在資料庫中。儲存過程只要編譯一次,第一次編譯之後可以直接呼叫,使用者給出 傳入引數執行他,儲存過程可以返回乙個或者多個結果集。基本建立方式 create or replace procedure name procedure inpu...

mysql 觸發器定義 mysql觸發器

什麼是觸發器 觸發器是與表有關的資料庫物件,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性。舉個例子,比如你現在有兩個表 使用者表 和 日誌表 當乙個使用者被建立的時候,就需要在日誌表中插入建立的log日誌,如果在不使用觸發器的情況下,你需...

在觸發器中自定義日誌

在觸發器中自定義日誌 vivianfdlpw 2005.10.24 引用請保留此資訊 create trigger tr on 表 for update as 記錄資訊 declare o int f int t int ret int info varchar 1000 要記錄的資訊 path v...