存儲過程與函數的區別
本質上沒區別,執行的本質都一樣。
只是函數有如:只能返回一個變數的限制。而存儲過程可以返回多個。
函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程要讓sql的query 可以執行, 需要把 mysql_real_connect 的最後一個參數設置為CLIENT_MULTI_STATEMENTS。
函數限制比較多,比如不能用臨時表,只能用表變數.還有一些函數都不可用等等.而存儲過程的限制相對就比較少。
特性區別如下:
1)一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。存儲過程,功能強大,可以執行包括修改表等一系列資料庫操作;用戶定義函數不能用於執行一組修改全局資料庫狀態的操作。
2)對於存儲過程來說可以返回參數,如記錄集,而函數只能返回值或者表對象。函數只能返回一個變數;而存儲過程可以返回多個。存儲過程的參數可以有IN,OUT,INOUT三種類型,而函數只能有IN類~~存儲過程聲明時不需要返回類型,而函數聲明時需要描述返回類型,且函數體中必須包含一個有效的RETURN語句。
3)存儲過程,可以使用非確定函數,不允許在用戶定義函數主體中內置非確定函數。
4)存儲過程一般是作為一個獨立的部分來執行( EXECUTE 語句執行),而函數可以作為查詢語句的一個部分來調用(SELECT調用),由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。 SQL語句中不可用存儲過程,而可以使用函數。
當存儲過程和函數被執行的時候,SQL Manager會到procere cache中去取相應的查詢語句,如果在procere cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。
Procere cache中保存的是執行計劃 (execution plan) ,當編譯好之後就執行procere cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標准一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。
MYSql存儲過程的作用及語法
作用:
1、使用存過過程,很多相似性的刪除,更新,新增等操作就變得輕鬆了,並且以後也便於管理!
2、存儲過程因為SQL語句已經預編繹過了,因此運行的速度比較快。
3、存儲過程可以接受參數、輸出參數、返回單個或多個結果集以及返回值。可以向程序返回錯誤原因。
4、存儲過程運行比較穩定,不會有太多的錯誤。只要一次成功,以後都會按這個程序運行。
5、存儲過程主要是在伺服器上運行,減少對客戶機的壓力。
6、存儲過程可以包含程序流、邏輯以及對資料庫的查詢。同時可以實體封裝和隱藏了數據邏輯。
7、存儲過程可以在單個存儲過程中執行一系列SQL語句。
8、存儲過程可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。
一、創建存儲過程
create procere sp_name()
begin
.........
end12341234
二、調用存儲過程
call sp_name()11
注意:存儲過程名稱後面必須加括弧,哪怕該存儲過程沒有參數傳遞
三、刪除存儲過程
drop procere sp_name//11
注意:不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程
四、區塊,條件,循環
1、區塊定義,常用
begin
......
end;123123
也可以給區塊起別名,如:
lable:begin
...........
end lable;123123
可以用leave lable;跳出區塊,執行區塊以後的代碼
2、條件語句
if 條件 then
statement
else
statement
end if;1234512345
3、循環語句
(1)while循環
[label:] WHILE expression DO
statements
END WHILE [label] ;1234512345
(2)、loop循環
[label:] LOOP
statements
END LOOP [label];1234512345
(3)、repeat until循環
[label:] REPEAT
statements
UNTIL expression
END REPEAT [label] ;12345671234567
五、其他常用命令
1.show procere status
顯示資料庫中所有存儲的存儲過程基本信息,包括所屬資料庫,存儲過程名稱,創建時間等
2.show create procere sp_name
顯示某一個存儲過程的詳細信息
函數function示例
CREATE DEFINER=`root`@`%` FUNCTION `spr_checkadmin`(acckey varchar(32), accpwd varchar(64)) RETURNS int(11)
BEGIN
DECLARE x INT;
SELECT COUNT(*) INTO x FROM admins WHERE account=acckey AND passwd=accpwd;
RETURN(x);
END;123456123456
單個返回值的存儲過程
CREATE DEFINER=`root`@`%` PROCEDURE `spr_getuserstorage`(tok varchar(128))
BEGIN
DECLARE acc VARCHAR(32);
DECLARE pkgid VARCHAR(32);
DECLARE regdate DATETIME;
DECLARE logindate DATETIME;
DECLARE sumsize BIGINT;
SELECT account INTO acc FROM userinfo WHERE token=tok;
IF (acc != NULL) THEN
SELECT SUM(filesize) INTO sumsize FROM userfiles WHERE account=acc;
SELECT packageid, registerdate, lastlogindate INTO pkgid, regdate, logindate FROM userinfo WHERE account=acc;
SELECT 0,pkgid,regdate,logindate;
ELSE
SELECT(-1);
END IF;
多個返回值存儲過程
CREATE DEFINER=`root`@`%` PROCEDURE `spr_queryfolderallfile`(sToken varchar(32), OUT sfid varchar(32), OUT sfext varchar(32))
BEGIN
DECLARE acc CHAR(32);
SELECT account INTO acc FROM userinfo WHERE token=sToken;
IF (acc != NULL) THEN
SELECT fileid, fileext INTO sfid, sfext FROM userfiles WHERE account=acc AND filetype=1;
END IF;
END;1234567812345678
㈡ MySQL存儲函數和存儲過程的區別
區別主要在於:
1、存儲過程沒有返回值,而函數必須有返回值;
2、存儲過程的參數可以是IN、OUT、INOUT類型,而函數的參數只能是IN類型。
㈢ MySQL和SQL Server存儲過程寫法上有什麼區別
一、多數指令是相同的,包括創建和修正存儲過程的指令。
二、很多細微的指令有不同,具體如下(不僅):
1 mysql支持enum,和set類型,sql server不支持。
2 mysql不支持nchar,nvarchar,ntext類型。
3 mysql的遞增語句是AUTO_INCREMENT,而mssql是identity(1,1)。
MYSQL:create table basic(id int key auto_increment,name varchar(20));
MSSQL: create table basic(id int identity(1,1) , name varchar(20))
4 msms默認到處表創建語句的默認值表示是((0)),而在mysql裡面是不允許帶兩括弧的。
5 mysql需要為表指定存儲類型。
6 mssql識別符是[],[type]表示他區別於關鍵字(可選用來包含表名、欄位名),但是mysql卻是 `(重音符,也就是按鍵1左邊的那個符號)。
7 mssql支持getdate()方法獲取當前時間日期,但是mysql裡面可以分日期類型和時間類型,獲取當前日期是cur_date(),當前完整時間是 now()函數。
8 mssql不支持replace into 語句,但是在最新的sql20008裡面,也支持merge語法。
㈣ mysql 存儲過程和函數的區別
mysql 存儲過程和函數的區別
1、
存儲過程實現的功能要復雜一點,函數實現的功能針對性比較強。
存儲過程,功能強大,可以執行包括修改表等一系列資料庫操作;
用戶定義函數不能用於執行一組修改全局資料庫狀態的操作。
2、
對於存儲過程來說可以返回參數,如記錄集,函數只能返回值或者表對象。
函數只能返回一個變數;而存儲過程可以返回多個;
存儲過程的參數可以有IN,OUT,INOUT三種類型,而函數只能有IN類;
存儲過程聲明時不需要返回類型,而函數聲明時需要描述返回類型,且函數體中必須包含一個有效的RETURN語句。
3、
存儲過程,可以使用非確定函數,不允許在用戶定義函數主體中內置非確定函數。
4、
存儲過程一般是作為一個獨立的部分來執行( EXECUTE 語句執行),而函數可以作為查詢語句的一個部分來調用(SELECT調用)。
由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。 SQL語句中不可用存儲過程,而可以使用函數。
㈤ mysql中的觸發器和存儲過程的區別是什麼
Mysql的觸發器相當於內部處理的一些過程,不帶入和帶出任何的參數。
其內部使用的參數就是新舊兩條記錄old和new的欄位。
用於完成數據表之間的觸發操作,來保證資料庫的一致性、完整性。
Mysql的存儲過程是類似於其它編程語言中的函數的功能。
存儲過程內部可以使用順序循環和轉移三種基本程序結構,而且整個存儲過程可以接受和返回參數。
㈥ MySQL資料庫存儲過程和事務的區別
事務是保證多個SQL語句的原子型的,也就是要麼一起完成,要麼一起不完成
存儲過程是把一批SQL語句預編譯後放在伺服器上,然後可以遠程調用
二者完全不是可對比的關系。
㈦ MySQL的存儲過程和存儲函數(UDF)的區別
背景
在上一篇推文中,我們介紹了 MySQL Group Replication 8.0.16 支持信息碎片化功能來增強大型事務處理能力。
如果您想在組復制中使用該功能,則任何組成員的版本都不能低於 8.0.16!
簡單地說就是由於低版本協議上不支持。MySQL 8.0.16 的組通訊開始支持新協議,簡稱「分段協議」,之前的版本中只有一種「壓縮協議」。
如果多個成員想加入復制組,那麼在協議匹配上遵循以下原則:
現有復制組成員和新加入成員版本相同,加入成功。
低版本成員想加入高版本的組會被驅逐,加入失敗。
高版本的成員想加入低版本的組,單獨加入成功,多個加入失敗。
一個 MySQL Server 8.0.16 實例可以成功加入使用通信協議版本 5.7.24 的組。
一個 MySQL Server 5.7.24 實例無法成功加入使用通信協議版本 8.0.16 的組。
兩個 MySQL Server 8.0.16 實例無法同時加入使用通信協議版本 5.7.24 的組。
兩個 MySQL Server 8.0.16 實例可以同時加入使用通信協議版本 8.0.16 的組。
SELECT group_replication_set_communication_protocol("8.0.15");
SELECT group_replication_get_communication_protocol(); +------------------------------------------------+ | group_replication_get_communication_protocol() | +------------------------------------------------+ | 5.7.14 | +------------------------------------------------+
例如:
新增 UDF
為了能讓高版本的復制組更便於加入低版本的成員,MySQL 8.0.16 新增兩個 UDF。
您可以使用兩個新的 UDF 命令去管理組通信協議:
1. group_replication_set_communication_protocol(new_protocol)
設置組復制通訊協議版本
填入一個所有成員都支持的版本號,即:new_protocol ≤ 所有成員的 MySQL版本。
new_protocol 格式:major.minor.patch (主版本號.次版本號.發布版本號)例如:8.0.15。
2. group_replication_get_communication_protocol()
獲取復制中最舊成員的 MySQL 版本號
獲取的版本號可能與設置的值不一致,但不一致的版本之間組復制協議是一樣的。
返回結果格式:major.minor.patch (主版本號.次版本號.發布版本號)例如:8.0.15。
以上兩個 UDF 對全部組成員有效,主機或從機上均可執行。
結論
若想使用信息碎片功能。建議將組復製成員全部升級為 8.0.16。
若組內成員版本僅有部分為 8.0.16,可以用兩個新的函數來讓高版本的成員保持與其它成員組協議一致。
㈧ mysql 函數 與 存儲過程 有什麼區別 如果不好回答 可以只說說 優缺點
1.存儲過程可以傳入、傳出變數,函數只有傳入
2.調用方式不同··存儲過程是CALL myfun(); 函數則是SELECT myfun();
樓下繼續補充~~~
㈨ 關於mysqli和mysql在處理存儲過程和事務的區別
常說的mysql與mysqli,那是說php方面的函數集,跟mysql資料庫沒有關系。
在php5之前,大家都是用php的mysql去驅動mysql的,如mysql_query()的函數,但這樣都是面向過程,算是第一代的mysql資料庫驅動程序,也比較原始兼容性好。
在php5以後,隨著面向對象的加入,就增加mysqli的函數功能,他是原先mysql系統函數的增強版,更穩定更高效更安全,如mysqli_query()。mysqli是面向對象,以對象的方式操作驅動mysql資料庫。這個算是第二代了。
mysql的函數,一般都有對應一個mysqli的函數,如mysql_query對應mysqli_query,功能一樣。當然mysqli也根據自身的特點加入了一些mysql沒有的函數。
支不支持事務,要看mysql資料庫的版本和存儲引擎,跟php的版本無關。
新軟體開發,建議還是用mysqli系列的面象對象方式,性能更好,但要考慮好環境的兼容問題。