儲存過程,是乙個資料庫物件,類似乙個函式。在儲存過程中可以使用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...