自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

mysql5存儲過程編寫實踐

數(shù)據(jù)庫 MySQL
mysql5存儲過程是mysql5操作過程中很重要的環(huán)節(jié)之一,mysql5存儲過程編寫是怎樣的呢?下文中將給出詳細的講解。

MySql5.0以后均支持存儲過程,研究了一下這個格式:

CREATE PROCEDURE 過程名 ([過程參數(shù)[,...]])

[特性 ...] 過程體

CREATE FUNCTION 函數(shù)名 ([函數(shù)參數(shù)[,...]])

RETURNS 返回類型

[特性 ...] 函數(shù)體

過程參數(shù):

[ IN | OUT | INOUT ] 參數(shù)名 參數(shù)類型

函數(shù)參數(shù):

參數(shù)名 參數(shù)類型

返回類型:

有效的MySQL數(shù)據(jù)類型即可

特性:

LANGUAGE SQL

| [NOT] DETERMINISTIC

| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

| SQL SECURITY { DEFINER | INVOKER }

| COMMENT 'string'

過程體/函數(shù)體:格式如下:

BEGIN

有效的SQL語句

END

我在這里不關心專有的特性,這些與SQL規(guī)范不兼容,所以characteristic(特性)的相關內(nèi)容不作考慮。

//

在開發(fā)過程中有幾點要注意:

1、存儲過程注釋:MySQL支持采用--或者/**/注釋,其中前者是行注釋,后者是段式注釋

2、變量首先用declare申明,其中臨時變量可以直接以@前綴修飾以供引用

3、直接采用MySQL的Administrator管理器編輯時,可以直接采用如下函數(shù)文本錄入;

但若在腳本中自動導入存儲過程或函數(shù)時,由于MySQL默認以";"為分隔符,則過程體的每一句

都被MySQL以存儲過程編譯,則編譯過程會報錯;所以要事先用DELIMITER關鍵字申明當前段分隔符

用完了就把分隔符還原。 如下所示:

DELIMITER $$

Stored Procedures and Functions

DELIMITER ;

4、MySQL支持大量的內(nèi)嵌函數(shù),有些是和大型商用數(shù)據(jù)庫如oracle、informix、sybase等一致,

但也有些函數(shù)名稱不一致,但功能一致;或者有些名稱一致,但功能相異,這個特別對于從

這些數(shù)據(jù)庫開發(fā)轉過來的DBA要注意。

5、存儲過程或函數(shù)的調試:我目前還沒有研究MySQL所帶的各種工具包,還不清楚其提供了調試工具

沒有,不過編譯錯誤相對好查找;至于業(yè)務流程的調試,可以采用一個比較笨的方法,就是創(chuàng)建一

個調試表,在包體中各個流程點都插入一條記錄,以觀察程序執(zhí)行流程。這也是一個比較方便的笨

辦法。^_^

下面是2個例子,提供了一種字串加密的算法,每次以相同的入?yún)⒄{用都會得到不同的加密結果,

算法相對比較簡單,不具備強度。分別以函數(shù)和過程的形式分別實現(xiàn)如下:

(1)函數(shù)

eg:

CREATE FUNCTION fun_addmm(inpass varchar(10)) RETURNS varchar(11)

BEGIN

declare string_in varchar(39);

declare string_out varchar(78);

declare offset tinyint(2);

declare outpass varchar(30) default ';

declare len tinyint;

/*declare i tinyint;*/

/**/

set len=LENGTH(inpass);

if((len<=0) or (len>10)) then

return "";

end if;

set offset=(SECOND(NOW()) mod 39)+1; /*根據(jù)秒數(shù)取模*/

/*insert into testtb values(offset,'offset: ');*/

set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_'; /*密鑰*/

set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));

/* insert into testtb values(2,outpass);*/

set string_out=CONCAT(string_out,string_out);

set @i=0;

REPEAT

set @i=@i+1;

set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));

/* insert into testtb values(@i+2,outpass);*/

UNTIL (@i>=len)

end REPEAT;

return outpass;

END

(2)過程

CREATE PROCEDURE `pro_addmm`(IN inpass varchar(10),OUT outpass varchar(11))

BEGIN

declare string_in varchar(39);

declare string_out varchar(78);

declare offset tinyint(2);

declare len tinyint;

set outpass=';

set len=LENGTH(inpass);

if((len<=0) or (len>10)) then

set outpass=';

else

set offset=(SECOND(NOW()) mod 39)+1;

set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#$_';

set string_in='_$#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));

set string_out=CONCAT(string_out,string_out);

set @i=0;

REPEAT

set @i=@i+1;

set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));

UNTIL (@i>=len)

end REPEAT;

end if;

END

//

執(zhí)行結果如下:

mysql> call pro_addmm('zhouys',@a);

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;

+---------+

| @a |

+---------+

| U_PI6$4 |

+---------+

1 row in set (0.00 sec)

mysql> call pro_addmm('zhouys',@a);

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;

+---------+

| @a |

+---------+

| 9P8UEGM |

+---------+

1 row in set (0.00 sec)

mysql> select fun_submm('U_PI6$4');

+----------------------+

| fun_submm('U_PI6$4') |

+----------------------+

| ZHOUYS |

+----------------------+

1 row in set (0.00 sec)

加密算法有幾個弱點:

1、不支持大小寫

2、不支持中文

3、加密強度不夠

上文中就mysql5存儲過程編寫做出了詳細的講解,希望大家都能夠認真學習,然后都能從中收獲自己所需要的知識,希望能夠幫助到大家。

【編輯推薦】

  1. mysql3升級到mysql5解決亂碼心得
  2. SQL Server 存儲過程的分頁
  3. 一個存儲過程實現(xiàn)增刪操作
  4. 2分法-通用存儲過程分頁
責任編輯:迎迎 來源: ChinaItLab
相關推薦

2010-06-04 19:57:09

2010-05-13 16:15:21

MySQL5 mast

2022-01-07 06:12:08

RPC框架限流

2010-04-07 12:08:28

Oracle存儲過程

2009-05-13 10:29:01

存儲過程OracleJava

2009-11-07 11:18:57

2010-07-06 14:06:52

SQL Server存

2020-11-26 10:33:44

MySQL存儲函數(shù)

2011-07-04 11:38:06

MySQL

2011-02-25 17:47:44

數(shù)據(jù)庫存儲編寫

2010-04-27 17:21:39

Oracle存儲過程

2021-10-15 06:43:11

數(shù)據(jù)庫存儲過程

2015-07-20 10:27:50

DockerDockerfile創(chuàng)建實例

2011-03-31 10:38:28

SQL Server編寫優(yōu)化

2010-04-15 16:06:02

Oracle存儲過程

2010-10-09 17:08:15

MySQL存儲過程

2020-11-02 13:24:49

MySQL數(shù)據(jù)庫存儲

2010-06-01 15:09:55

MySQL 存儲過程

2019-01-02 13:03:53

MySQL存儲權限

2010-06-12 15:46:56

MySQL5
點贊
收藏

51CTO技術棧公眾號