国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【?MySQL | 存儲過程與函數(shù)】概述 | 創(chuàng)建 | 調(diào)用 | 查看 | 修改 | 刪除 | 爭議

這篇具有很好參考價(jià)值的文章主要介紹了【?MySQL | 存儲過程與函數(shù)】概述 | 創(chuàng)建 | 調(diào)用 | 查看 | 修改 | 刪除 | 爭議。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

?歡迎來到小K的MySQL專欄,本節(jié)將為大家?guī)鞰ySQL存儲過程與函數(shù)概述 | 創(chuàng)建 | 調(diào)用 | 查看 | 修改 | 刪除 | 爭議的分享?


MySql從5.0版本開始支持存儲過程和函數(shù),存儲過程和函數(shù)能夠?qū)?fù)雜的SQL邏輯封裝在一起,應(yīng)用程序無須關(guān)注存儲過程和函數(shù)內(nèi)部復(fù)雜的SQL邏輯,而只需要簡單地調(diào)用存儲過程和函數(shù)即可。

1. 存儲過程概述

1.1概念

存儲過程(Stroed Procedure),它的思想很簡單,他就是一組經(jīng)過預(yù)先編譯的SQL語句的封裝。

存儲過程預(yù)先存儲在MySQL服務(wù)器上,需要執(zhí)行的時(shí)候,客戶端只需要向服務(wù)器發(fā)出調(diào)用存儲過程的命令,服務(wù)器就可以把預(yù)先存儲好的這一系列SQL語句全部執(zhí)行。

好處:

  • 簡化操作,提高了SQL語句的重用性,減少了開發(fā)程序員的壓力
  • 減少操作過程中的失誤,提高效率
  • 減少網(wǎng)絡(luò)傳輸量(客戶端不需要把所有的SQL語句通過網(wǎng)絡(luò)發(fā)送給服務(wù)器)
  • 減少了SQL語句暴露在網(wǎng)上的風(fēng)險(xiǎn),也提高了數(shù)據(jù)查詢的安全性

2. 創(chuàng)建存儲過程

2.1 語法分析

CREATE PROCEDURE [IF NOT EXISTS] 存儲過程名([IN|OUT|INOUT 參數(shù)名 參數(shù)類型,...])
[characteristics ...]
BEGIN
	存儲過程體
END

存儲過程名不能與已經(jīng)存在的存儲過程名重名。推薦存儲過程名命名為procedure_xxx 或者 proc_xxx。

參數(shù)分類

存儲過程的參數(shù)可以是IN、OUT、INOUT。

  • IN 表示傳入?yún)?shù)
  • OUT 表示傳出參數(shù)
  • INOUT 表示即可以傳入也可以傳出
  • 也可以不寫參數(shù)
  • 也可以寫多個(gè)不同類型的參數(shù)

charcateristics可選參數(shù)為:

LANGUAGE SQL
| [NOT] DETERMINISTTIC
| {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
| SQL DECURITY {DEFINER|INVOKER}
| COMMENT 'string'
  • LANGUAGE SQL :說明存儲過程執(zhí)行體是由SQL語句組成的,當(dāng)前系統(tǒng)支持的語言為SQL。

  • [NOT] DETERMINISTIC:指明存儲過程執(zhí)行的結(jié)果是否確定。DETERMINISTIC表示結(jié)果是確定的。每次執(zhí)行存儲過程時(shí),相同的輸入會得到相同的輸出。NOT DETERMINISTIC表示結(jié)果是不確定的,相同的輸入可能得到不同的輸出。如果沒有指定任意一個(gè)值,默認(rèn)為NOT DETERMINISTIC。

  • { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使用SQL語句的限制。

    • CONTAINS SQL表示當(dāng)前存儲過程的子程序包含SQL語句,但是并不包含讀寫數(shù)據(jù)的SQL語句;
    • NO SQL表示當(dāng)前存儲過程的子程序中不包含任何SQL語句;
    • READS SQL DATA表示當(dāng)前存儲過程的子程序中包含讀數(shù)據(jù)的SQL語句;
    • MODIFIES SQL DATA表示當(dāng)前存儲過程的子程序中包含寫數(shù)據(jù)的SQL語句。
    • 默認(rèn)情況下,系統(tǒng)會指定為CONTAINS SQL。
  • SQL SECURITY {DEFINER | INVOKER}:執(zhí)行當(dāng)前存儲過程的權(quán)限,即指明哪些用戶能夠執(zhí)行當(dāng)前存儲過程。

    • DEFINER 表示只有當(dāng)前存儲過程的創(chuàng)建者或者定義者才能執(zhí)行當(dāng)前存儲過程;
    • INVOKER 表示擁有當(dāng)前存儲過程的訪問權(quán)限的用戶能夠執(zhí)行當(dāng)前存儲過程。
    • 如果沒有設(shè)置相關(guān)的值,則MySQL默認(rèn)指定值為DEFINER。
  • COMMENT 'string'注釋信息,可以用來描述存儲過程。

存儲過程體中可以有多條 SQL 語句,如果僅僅一條SQL 語句,則可以省略 BEGIN 和 END

編寫存儲過程并不是一件簡單的事情,可能存儲過程中需要復(fù)雜的 SQL 語句。

BEGIN ... END :中間包含了多個(gè)語句,每個(gè)語句都以(;)號為結(jié)束符。
DECLARE:DECLARE 用來聲明變量,使用的位置在于 BEGIN ... END 語句中間,而且需要在其他語句使用之前進(jìn)行變量的聲明。
SET:賦值語句,用于對變量進(jìn)行賦值。
SELECT… INTO:把從數(shù)據(jù)表中查詢的結(jié)果存放到變量中,也就是為變量賦值。

需要設(shè)置新的結(jié)束標(biāo)記

DELIMITER 新的結(jié)束標(biāo)記

因?yàn)镸ySQL默認(rèn)的語句結(jié)束符號為分號‘;’。為了避免與存儲過程中SQL語句結(jié)束符相沖突,需要使DELIMITER改變存儲過程的結(jié)束符。

比如:“DELIMITER //”語句的作用是將MySQL的結(jié)束符設(shè)置為//,并以“END //”結(jié)束存儲過程。存儲過程定義完畢之后再使用“DELIMITER ;”恢復(fù)默認(rèn)結(jié)束符。DELIMITER也可以指定其他符號作為結(jié)束符。

如果使用的是 Navicat 工具,那么在編寫存儲過程的時(shí)候,Navicat 會自動設(shè)置 DELIMITER 為其他符號, 我們不需要再進(jìn)行 DELIMITER 的操作。

當(dāng)使用DELIMITER命令時(shí),應(yīng)該避免使用反斜杠(‘\’)字符,因?yàn)榉葱本€是MySQL的轉(zhuǎn)義字符。

DELIMITER $

CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數(shù)名 參數(shù)類型,...) 
[characteristics ...]
BEGIN
	sql語句1; 
	sql語句2;

END $
DELIMITER;

2.2代碼舉例

  1. 創(chuàng)建存儲過程proc_show_emps(),查看 emps 表的所有數(shù)據(jù)
CREATE PROCEDURE proc_show_emps()
BEGIN
	SELECT * FROM emp;
END;

CALL proc_show_emps();
  1. 創(chuàng)建存儲過程proc_emps_avgsal(),查看所有員工的平均工資
CREATE PROCEDURE proc_emps_avgsal()
BEGIN
	SELECT AVG(sal) AS avgsal FROM emp;
END;

CALL proc_emps_avgsal();
  1. 創(chuàng)建存儲過程proc_emps_maxsal(),用來查看“emps”表的最高薪資值。
CREATE PROCEDURE proc_emps_maxsal()
BEGIN 
	SELECT MAX(sal) FROM emp;
END;
CALL proc_emps_maxsal();
  1. 創(chuàng)建存儲過程proc_emps_minsal(),查看“emps”表的最低薪資值。并將最低薪資通過OUT參數(shù)“ms” 輸出
CREATE PROCEDURE proc_emps_minsal(OUT ms INT)
BEGIN
	SELECT MIN(sal) INTO ms FROM emp;
END;
CALL proc_emps_minsal(@minsal);
SELECT @minsal;
  1. 創(chuàng)建存儲過程proc_someone_sal(),查看“emps”表的某個(gè)員工的薪資,并用IN參數(shù)empname 輸入員工姓名。
CREATE PROCEDURE proc_someone_sal(IN empname VARCHAR(20))
BEGIN
	SELECT sal FROM emp WHERE ename=empname;
END;
CALL proc_someone_sal('ALLEN');
SELECT * FROM emp;
SET @ename='king';
CALL proc_someone_sal(@ename);
  1. 創(chuàng)建存儲過程proc_someone_sal2(),查看“emps”表的某個(gè)員工的薪資,并用IN參數(shù)empname 傳入員工姓名,用OUT參數(shù)empsal傳出員工薪資。
CREATE PROCEDURE proc_someone_sal2(IN empname VARCHAR(20),OUT empsal DOUBLE)
BEGIN
	SELECT sal INTO empsal FROM emp WHERE ename=empname;
END;
CALL proc_someone_sal2('ALLEN',@ALLENsal);
SELECT @ALLENsal;
  1. 創(chuàng)建存儲過程proc_show_mgr_name(),查詢某個(gè)員工領(lǐng)導(dǎo)的姓名,并用INOUT參數(shù)“empname”輸入員工姓名,直接輸出領(lǐng)導(dǎo)的姓名。
CREATE PROCEDURE proc_show_mgr_name(INOUT name VARCHAR(20))
BEGIN
	SELECT ename INTO name FROM emp WHERE empno=(SELECT mgr FROM emp WHERE ename=name);
END;
SET @name='ALLEN';
CALL proc_show_mgr_name(@name);
SELECT @name;

3. 調(diào)用存儲過程

3.1調(diào)用格式

存儲過程有多種調(diào)用方法。存儲過程必須使用CALL語句調(diào)用,并且存儲過程和數(shù)據(jù)庫相關(guān),如果要執(zhí)行 其他數(shù)據(jù)庫中的存儲過程,需要指定數(shù)據(jù)庫名稱,例如CALL dbname.procname。

CALL 存儲過程名(實(shí)參列表)

格式:

1、調(diào)用IN模式參數(shù):

CALL proc_show('值')

2、調(diào)用OUT模式參數(shù):

CALL proc_show(@name);
SELECT @name;

3、調(diào)用INOUT模式參數(shù):

SET @name=值;
CALL proc_show(@name);
SELECT @name;

3.2代碼舉例

舉例:傳入指定的部門編號,返回該部門人數(shù)

DELIMITER //

CREATE PROCEDURE proc_count(IN dno INT,OUT num INT) 
BEGIN
	SELECT COUNT(*) INTO num FROM emps WHERE deptno = dno;
END //

DELIMITER ;

調(diào)用及查看結(jié)果:

SET @cnt;
CALL proc_count(20,@cnt);
SELECT @cnt;

3.3如何調(diào)試

在 MySQL 中,存儲過程不像普通的編程語言(比如 C++、Java 等)那樣有專門的集成開發(fā)環(huán)境。因此,你可以通過 SELECT 語句,把程序執(zhí)行的中間結(jié)果查詢出來,來調(diào)試一個(gè) SQL 語句的正確性。

調(diào)試成功之后,把 SELECT 語句后移到下一個(gè) SQL 語句之后,再調(diào)試下一個(gè) SQL 語句。這樣 逐步推進(jìn) ,就可以完成對存儲過程中所有操作的調(diào)試了。當(dāng)然,你也可以把存儲過程中的 SQL 語句復(fù)制出來,逐段單獨(dú)調(diào)試。

4. 存儲函數(shù)的使用

前面學(xué)習(xí)了很多函數(shù),使用這些函數(shù)可以對數(shù)據(jù)進(jìn)行的各種處理操作,極大地提高用戶對數(shù)據(jù)庫的管理 效率。MySQL支持自定義函數(shù),定義好之后,調(diào)用方式與調(diào)用MySQL預(yù)定義的系統(tǒng)函數(shù)一樣。

4.1語法分析

學(xué)過的函數(shù):LENGTH、SUBSTR、CONCAT等

語法格式:

CREATE FUNCTION 函數(shù)名(參數(shù)名 參數(shù)類型,...)
RETURNS 返回值類型
[characteristics ...] 
BEGIN
	函數(shù)體	#函數(shù)體中肯定有 RETURN 語句
END

說明:

1、參數(shù)列表:指定參數(shù)為IN、OUT或INOUT只對PROCEDURE是合法的,F(xiàn)UNCTION中總是默認(rèn)為IN參數(shù)。

2、RETURNS type 語句表示函數(shù)返回?cái)?shù)據(jù)的類型;

RETURNS子句只能對FUNCTION做指定,對函數(shù)而言這是 強(qiáng)制 的。它用來指定函數(shù)的返回類型,而且函數(shù)體必須包含一個(gè) RETURN value 語句。

3、characteristic 創(chuàng)建函數(shù)時(shí)指定的對函數(shù)的約束。取值與創(chuàng)建存儲過程時(shí)相同,這里不再贅述。

4、函數(shù)體也可以用BEGIN…END來表示SQL代碼的開始和結(jié)束。如果函數(shù)體只有一條語句,也可以省略BEGIN…END。

4.2調(diào)用存儲函數(shù)

在MySQL中,存儲函數(shù)的使用方法與MySQL內(nèi)部函數(shù)的使用方法是一樣的。換言之,用戶自己定義的存儲函數(shù)與MySQL內(nèi)部函數(shù)是一個(gè)性質(zhì)的。區(qū)別在于,存儲函數(shù)是 用戶自己定義 的,而內(nèi)部函數(shù)是MySQL的開發(fā)者定義的。

SELECT 函數(shù)名(實(shí)參列表) 

4.3 代碼舉例

  1. 創(chuàng)建存儲函數(shù),名稱為fun_hiredate(),參數(shù)定義為空,該函數(shù)查詢WARD的入職日期,并返回,數(shù)據(jù)類型為日期類型。
CREATE FUNCTION fun_hiredate() 
RETURNS DATE
DETERMINISTIC
CONTAINS SQL
BEGIN
	RETURN (SELECT hiredate FROM emp WHERE ename = 'WARD'); 
END;

調(diào)用:

SELECT fun_hiredate();
  1. 創(chuàng)建存儲函數(shù),名稱為fun_getsal(),參數(shù)傳入empno,該函數(shù)查詢empno的sal,并返回,數(shù)據(jù)類型為SMALLINT。
CREATE FUNCTION fun_getsal(empno1 INT)
RETURNS SMALLINT
DETERMINISTIC
CONTAINS SQL
BEGIN
   RETURN (SELECT sal FROM emp WHERE empno=empno1);
END;

調(diào)用:

SET @eno=6666;
SELECT fun_getsal(@eno);
  1. 創(chuàng)建存儲函數(shù)fun_dept_count(),參數(shù)傳入deptno,該函數(shù)查詢deptno部門的員工人數(shù),并返回,數(shù)據(jù)類型為整型。
CREATE FUNCTION fun_dept_count(dno INT)
RETURNS INT
DETERMINISTIC
CONTAINS SQL
BEGIN
	RETURN (SELECT COUNT(*) FROM emp WHERE deptno=dno);
END;

調(diào)用:

SELECT fun_dept_count(10);

注意:

若在創(chuàng)建存儲函數(shù)中報(bào)錯“ you might want to use the less safe log_bin_trust_function_creators variable ”,有兩種處理方法:

  • 方式1:加上必要的函數(shù)特性“[NOT] DETERMINISTIC”和“{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}”

  • 方式2:

    SET GLOBAL log_bin_trust_function_creators = 1;
    

4.4 對比存儲函數(shù)和存儲過程

關(guān)鍵字 調(diào)用語法 返回值 應(yīng)用場景
存儲過程 PROCEDURE CALL 存儲過程() 理解為有0個(gè)或多個(gè) 一般用于更新
存儲函數(shù) FUNCTION SELECT 函數(shù)() 只能是一個(gè) 一般用于查詢結(jié)果為一個(gè)值并返回時(shí)

此外,存儲函數(shù)可以放在查詢語句中使用,存儲過程不行。反之,存儲過程的功能更加強(qiáng)大,包括能夠 執(zhí)行對表的操作(比如創(chuàng)建表,刪除表等)和事務(wù)操作,這些功能是存儲函數(shù)不具備的。

5. 存儲過程和函數(shù)的查看、修改、刪除

5.1查看

創(chuàng)建完之后,怎么知道我們創(chuàng)建的存儲過程、存儲函數(shù)是否成功了呢?

MySQL存儲了存儲過程和函數(shù)的狀態(tài)信息,用戶可以使用SHOW STATUS語句或SHOW CREATE語句來查看,也可直接從系統(tǒng)的information_schema數(shù)據(jù)庫中查詢。這里介紹3種方法。

1. 使用SHOW CREATE語句查看存儲過程和函數(shù)的創(chuàng)建信息

基本語法結(jié)構(gòu)如下:

SHOW CREATE {PROCEDURE | FUNCTION} 存儲過程名或函數(shù)名

舉例:

SHOW CREATE FUNCTION db_13.fun_getsal;

2. 使用 SHOW STATUS 語句查看存儲過程和函數(shù)的狀態(tài)信息

基本語法結(jié)構(gòu)如下:

SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']

這個(gè)語句返回子程序的特征,如數(shù)據(jù)庫、名字、類型、創(chuàng)建者及創(chuàng)建和修改日期。

[LIKE ‘pattern’]:匹配存儲過程或函數(shù)的名稱,可以省略。當(dāng)省略不寫時(shí),會列出MySQL數(shù)據(jù)庫中存在的所有存儲過程或函數(shù)的信息。 舉例:SHOW STATUS語句示例,代碼如下:

SHOW PROCEDURE STATUS LIKE 'SELECT%';

2. 從information_schema.Routines表中查看存儲過程和函數(shù)的信息

MySQL中存儲過程和函數(shù)的信息存儲在information_schema數(shù)據(jù)庫下的Routines表中??梢酝ㄟ^查詢該表 的記錄來查詢存儲過程和函數(shù)的信息。其基本語法形式如下:

SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='存儲過程或函數(shù)的名' [AND ROUTINE_TYPE = {'PROCEDURE|FUNCTION'}];

說明:如果在MySQL數(shù)據(jù)庫中存在存儲過程和函數(shù)名稱相同的情況,最好指定ROUTINE_TYPE查詢條件來 指明查詢的是存儲過程還是函數(shù)。

舉例:從Routines表中查詢名稱為proc_count的存儲函數(shù)的信息,代碼如下:

SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='count_by_id' AND ROUTINE_TYPE = 'FUNCTION';

5.2 修改

修改存儲過程或函數(shù),不影響存儲過程或函數(shù)功能,只是修改相關(guān)特性。使用ALTER語句實(shí)現(xiàn)。

ALTER {PROCEDURE | FUNCTION} 存儲過程或函數(shù)的名 [characteristic ...]

其中,characteristic指定存儲過程或函數(shù)的特性,其取值信息與創(chuàng)建存儲過程、函數(shù)時(shí)的取值信息略有 不同。

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
  • CONTAINS SQL ,表示子程序包含SQL語句,但不包含讀或?qū)憯?shù)據(jù)的語句。

  • NO SQL ,表示子程序中不包含SQL語句。

  • READS SQL DATA ,表示子程序中包含讀數(shù)據(jù)的語句。

  • MODIFIES SQL DATA ,表示子程序中包含寫數(shù)據(jù)的語句。

  • SQL SECURITY { DEFINER | INVOKER },指明誰有權(quán)限來執(zhí)行。

    • DEFINER ,表示只有定義者自己才能夠執(zhí)行。
    • INVOKER ,表示調(diào)用者可以執(zhí)行。
  • COMMENT ‘string’ ,表示注釋信息。

修改存儲過程使用ALTER PROCEDURE語句,修改存儲函數(shù)使用ALTER FUNCTION語句。但是,這兩個(gè)語句的結(jié)構(gòu)是一樣的,語句中的所有參數(shù)也是一樣的。

舉例1:修改存儲過程pro_coutn的定義。將讀寫權(quán)限改為MODIFIES SQL DATA,并指明調(diào)用者可以執(zhí)行,代碼如下:

ALTER PROCEDURE CountProc 
MODIFIES SQL DATA
SQL SECURITY INVOKER ;

查詢修改后的信息:

SELECT specific_name,sql_data_access,security_type 
FROM information_schema.`ROUTINES`
WHERE routine_name = 'CountProc' AND routine_type = 'PROCEDURE';

結(jié)果顯示,存儲過程修改成功。從查詢的結(jié)果可以看出,訪問數(shù)據(jù)的權(quán)限(SQL_DATA_ ACCESS)已經(jīng)變成MODIFIES SQL DATA,安全類型(SECURITY_TYPE)已經(jīng)變成INVOKER。

舉例2:修改存儲函數(shù)CountProc的定義。將讀寫權(quán)限改為READS SQL DATA,并加上注釋信息“getsal”,代碼如下:

ALTER FUNCTION fun_getsal 
READS SQL DATA
COMMENT 'getsal' ;

存儲函數(shù)修改成功。從查詢的結(jié)果可以看出,訪問數(shù)據(jù)的權(quán)限(SQL_DATA_ACCESS)已經(jīng)變成READS SQL DATA,函數(shù)注釋(ROUTINE_COMMENT)已經(jīng)變成FIND NAME。

5.3刪除

刪除存儲過程和函數(shù),可以使用DROP語句,其語法結(jié)構(gòu)如下:

DROP {PROCEDURE | FUNCTION} [IF EXISTS] 存儲過程或函數(shù)的名

IF EXISTS:如果程序或函數(shù)不存儲,它可以防止發(fā)生錯誤,產(chǎn)生一個(gè)用SHOW WARNINGS查看的警告。

舉例:

DROP PROCEDURE getsal;
DROP FUNCTION getsal;

6. 關(guān)于存儲過程使用的爭議

盡管存儲過程有諸多優(yōu)點(diǎn),但是對于存儲過程的使用,一直都存在著很多爭議,比如有些公司對于大型 項(xiàng)目要求使用存儲過程,而有些公司在手冊中明確禁止使用存儲過程,為什么這些公司對存儲過程的使用需求差別這么大呢?

6.1優(yōu)點(diǎn)

1、存儲過程可以一次編譯多次使用。存儲過程只在創(chuàng)建時(shí)進(jìn)行編譯,之后的使用都不需要重新編譯,這就提升了 SQL 的執(zhí)行效率。

2、可以減少開發(fā)工作量。將代碼封裝成模塊,實(shí)際上是編程的核心思想之一,這樣可以把復(fù)雜的問題拆解成不同的模塊,然后模塊之間可以 重復(fù)使用 ,在減少開發(fā)工作量的同時(shí),還能保證代碼的結(jié)構(gòu)清晰。

3、存儲過程的安全性強(qiáng)。我們在設(shè)定存儲過程的時(shí)候可以 設(shè)置對用戶的使用權(quán)限 ,這樣就和視圖一樣具有較強(qiáng)的安全性。

4、可以減少網(wǎng)絡(luò)傳輸量。因?yàn)榇a封裝到存儲過程中,每次使用只需要調(diào)用存儲過程即可,這樣就減 少了網(wǎng)絡(luò)傳輸量。

5、良好的封裝性。在進(jìn)行相對復(fù)雜的數(shù)據(jù)庫操作時(shí),原本需要使用一條一條的 SQL 語句,可能要連接多次數(shù)據(jù)庫才能完成的操作,現(xiàn)在變成了一次存儲過程,只需要 連接一次即可 。

6.2 缺點(diǎn)

基于上面這些優(yōu)點(diǎn),不少大公司都要求大型項(xiàng)目使用存儲過程,比如微軟、IBM 等公司。但是國內(nèi)的阿里并不推薦開發(fā)人員使用存儲過程,這是為什么呢?

阿里開發(fā)規(guī)范

【強(qiáng)制】禁止使用存儲過程,存儲過程難以調(diào)試和擴(kuò)展,更沒有移植性。

存儲過程雖然有諸如上面的好處,但缺點(diǎn)也是很明顯的。

1、可移植性差。存儲過程不能跨數(shù)據(jù)庫移植,比如在 MySQL、Oracle 和 SQL Server 里編寫的存儲過程,在換成其他數(shù)據(jù)庫時(shí)都需要重新編寫。

2、調(diào)試?yán)щy。只有少數(shù) DBMS 支持存儲過程的調(diào)試。對于復(fù)雜的存儲過程來說,開發(fā)和維護(hù)都不容易。雖然也有一些第三方工具可以對存儲過程進(jìn)行調(diào)試,但要收費(fèi)。

3、存儲過程的版本管理很困難。比如數(shù)據(jù)表索引發(fā)生變化了,可能會導(dǎo)致存儲過程失效。我們在開發(fā) 軟件的時(shí)候往往需要進(jìn)行版本管理,但是存儲過程本身沒有版本控制,版本迭代更新的時(shí)候很麻煩。

4、它不適合高并發(fā)的場景。高并發(fā)的場景需要減少數(shù)據(jù)庫的壓力,有時(shí)數(shù)據(jù)庫會采用分庫分表的方式,而且對可擴(kuò)展性要求很高,在這種情況下,存儲過程會變得難以維護(hù), 增加數(shù)據(jù)庫的壓力 ,顯然就不適用了。

總結(jié)

存儲過程既方便,又有局限性。盡管不同的公司對存儲過程的態(tài)度不一,但是對于我們開發(fā)人員來說, 不論怎樣,掌握存儲過程都是必備的技能之一。~下節(jié)帶來變量、流程控制與游標(biāo)的分享文章來源地址http://www.zghlxwxcb.cn/news/detail-689604.html

到了這里,關(guān)于【?MySQL | 存儲過程與函數(shù)】概述 | 創(chuàng)建 | 調(diào)用 | 查看 | 修改 | 刪除 | 爭議的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)庫系統(tǒng)原理及MySQL應(yīng)用教程實(shí)驗(yàn)七存儲過程與函數(shù)的創(chuàng)建管理

    數(shù)據(jù)庫系統(tǒng)原理及MySQL應(yīng)用教程實(shí)驗(yàn)七存儲過程與函數(shù)的創(chuàng)建管理

    1. 理解存儲過程和函數(shù)的概念。 2. 掌握創(chuàng)建存儲過程和函數(shù)的方法。 3. 掌握執(zhí)行存儲過程和函數(shù)的方法。 4. 掌握游標(biāo)的定義、使用方法。 1.驗(yàn)證性實(shí)驗(yàn):某超市的食品管理的數(shù)據(jù)庫的Food表對其操作。 2.設(shè)計(jì)性試驗(yàn):學(xué)校教師管理數(shù)據(jù)庫中的teacherInfo表對其操作。 三、實(shí)驗(yàn)步

    2024年02月03日
    瀏覽(23)
  • Mysql存儲過程調(diào)用

    Mysql存儲過程調(diào)用

    項(xiàng)目結(jié)構(gòu): 準(zhǔn)備數(shù)據(jù) CREATE TABLE `demo_entity` ( ? `id` bigint(20) NOT NULL AUTO_INCREMENT, ? `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, ? `age` bigint(20) DEFAULT \\\'0\\\', ? `cdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, ? `udate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, ? PRIMARY KEY (`id`) ) EN

    2024年02月05日
    瀏覽(26)
  • 華納云:PHP如何調(diào)用MySQL存儲過程

    這篇文章主要介紹了PHP如何調(diào)用MySQL存儲過程的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇PHP如何調(diào)用MySQL存儲過程文章都會有所收獲,下面我們一起來看看吧。 什么是MySQL存儲過程 MySQL存儲過程是一段可以重復(fù)使用的SQL代碼塊,可以在

    2023年04月21日
    瀏覽(20)
  • Mysql 存儲過程 / 存儲函數(shù)

    Mysql 存儲過程 / 存儲函數(shù)

    目錄 0 課程視頻 1 基本語法 1.0 作用 -在數(shù)據(jù)庫中 封裝sql語句 - 復(fù)用 - 減少網(wǎng)絡(luò)交互 -可接收參數(shù)返回?cái)?shù)據(jù) 1.1 創(chuàng)建 1.2 調(diào)用 1.3 查看 1.4 刪除 1.5 ; 封號結(jié)束符 改成 $$ 雙刀符合結(jié)束語句 - 因?yàn)榇虬馓柦Y(jié)束有沖突 1.6 在cmd 中定義 存儲過程 打包的事務(wù) - 打包完 可以改回 封號 ?

    2024年02月01日
    瀏覽(25)
  • MySQL——存儲過程與存儲函數(shù)

    MySQL從 5.0版本 開始支持 存儲過程 和 存儲函數(shù) 。存儲過程和函數(shù)能夠?qū)?fù)雜的SQL邏輯封裝在一起,應(yīng)用程序無須關(guān)注存儲過程和函數(shù)內(nèi)部復(fù)雜的SQL邏輯,而只需要簡單地調(diào)用存儲過程和函數(shù)即可。 1.1 理解 含義 :存儲過程的英文是 Stored Procedure 。它的思想很簡單,就是一組

    2024年02月10日
    瀏覽(21)
  • MySQL(視圖,存儲函數(shù),存儲過程)

    MySQL(視圖,存儲函數(shù),存儲過程)

    作業(yè)1: ?作業(yè)實(shí)現(xiàn): 首先創(chuàng)建學(xué)生表,課程表,以及學(xué)生選課表。 ?1.用SQL語句創(chuàng)建學(xué)生表student,定義主鍵,姓名不能重名,性別只能輸入男或女,所在系的默認(rèn)值是 “計(jì)算機(jī)”。 2.修改student 表中年齡(age)字段屬性,數(shù)據(jù)類型由int 改變?yōu)閟mallint。 3.為SC表建立按學(xué)號(

    2024年01月21日
    瀏覽(21)
  • MySQL之存儲過程和存儲函數(shù)

    MySQL之存儲過程和存儲函數(shù)

    能夠?qū)⑼瓿商囟üδ艿腟QL指令進(jìn)行封裝(SQL指令集),編譯之后存儲在數(shù)據(jù)庫服務(wù)器上,并且為之取一個(gè)名字,客戶端可以通過名字直接調(diào)用這個(gè)SQL指令集,獲取執(zhí)行結(jié)果。 2.1 優(yōu)點(diǎn) (1)SQL指令無需經(jīng)客戶端編寫通過網(wǎng)絡(luò)傳送,可以節(jié)省網(wǎng)絡(luò)開銷,同時(shí)避免使用SQL指令在網(wǎng)絡(luò)傳

    2024年02月05日
    瀏覽(21)
  • MySQL存儲函數(shù)與存儲過程習(xí)題

    MySQL存儲函數(shù)與存儲過程習(xí)題

    創(chuàng)建表并插入數(shù)據(jù): 1、創(chuàng)建一個(gè)可以統(tǒng)計(jì)表格內(nèi)記錄條數(shù)的存儲函數(shù) ,函數(shù)名為count_sch() 先創(chuàng)建一個(gè)表并插入一些數(shù)據(jù): mysql d // mysql create function count_sch() - returns int - begin - declare i int default 0; - select count(*) into i from sch; - return i; - end // Query OK, 0 rows affected (0.00 sec) mysql sel

    2024年01月19日
    瀏覽(19)
  • mysql:存儲過程的創(chuàng)建與使用

    mysql:存儲過程的創(chuàng)建與使用

    一、創(chuàng)建存儲過程 使用MySql Workbench創(chuàng)建存儲過程,一定要記得使用 delimiter 指明結(jié)束符,否則會報(bào)錯:Statement is incomplete, expecting: \\\';’ 錯誤示例: 正確示例: 其中,//就是結(jié)束符,可以自行指定,比如一般都用$$。 二、存儲過程語法 這里就不照搬官方的語法了,按照我的理

    2024年02月09日
    瀏覽(22)
  • MySQL數(shù)據(jù)庫——MySQL修改存儲過程(ALTER PROCEDURE)

    在實(shí)際開發(fā)過程中,業(yè)務(wù)需求修改的情況時(shí)有發(fā)生,所以修改 MySQL 中的存儲過程是不可避免的。 MySQL 中通過 ALTER PROCEDURE 語句來修改存儲過程。下面將詳細(xì)講解修改存儲過程的方法。 MySQL 中修改存儲過程的語法格式如下: ALTER PROCEDURE 存儲過程名 [ 特征 ... ] 特征 指定了存儲

    2024年02月04日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包