摘要:利用數據庫存儲過程產生軟件開發(fā)測試表中的模擬數據是一個非常有效的方法,而標準SQL是非過程化的語言,和程序設計語言相比,高度非過程化的優(yōu)點也造成其一個弱點:缺少流程控制能力,難以實現應用業(yè)務中的邏輯控制,而在各行業(yè)應用中存在很多很復雜的業(yè)務邏輯,簡單的標準SQL語言不能承擔該角色,解決的辦法就是要采用面向過程的如PL/SQL、T-SQL語言即存儲過程方法。該論文采用MySQL 存儲過程來模擬車輛通行信息,采用參數的方法,自動生成該參數指定行數的表記錄,供調試程序或統(tǒng)計的模擬數據源。
關鍵詞:數據庫;存儲過程;Mysql
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)20-0016-03
標準SQL是非過程化的查詢語言,具有操作統(tǒng)一、面向集合、功能豐富、使用簡單等優(yōu)點。但和程序設計語言相比,高度非過程化的優(yōu)點也造成了它的一個弱點:缺少流程控制能力,難以實現應用業(yè)務中的邏輯控制,而在各行業(yè)應用中存在很多很復雜的業(yè)務邏輯,簡單的標準SQL語言不能承擔該角色,這就提出可以面向過程的如PL/SQL、T-SQL數據庫語言進行編程,即存儲過程方式,通過if then 語句或其他DML SQL 來生成所需要的數據。這種方式僅簡單,而且容易實現,容易調試,并且可以包含一些業(yè)務邏輯和事務控制,是生成模擬數據的一種高效方法。
1模擬數據生成的意義背景
程序開發(fā)離不開數據源,比如商務網站開發(fā),表中數據是否真實,是否滿足要求,對調試程序有很大的幫助測試作用,能幫助開發(fā)者快速發(fā)現程序的應用設計是否滿足流程要求,數據查詢和統(tǒng)計是否正確,以及大數據平臺下的程序性能和網站的響應時間,對用戶的真實體驗等是非常關鍵的一個步驟,目前開發(fā)環(huán)境下數據庫表中數據的量級常常不能滿足大記錄數據的要求,比如100萬行記錄或更高,本論文利用存儲過程生成大批量數據,有助于真實數據的模擬和統(tǒng)計速度的統(tǒng)計查詢,有較好的應用場景。
2數據庫存儲過程編程優(yōu)點
存儲過程的優(yōu)點是明顯的,使用存儲過程具有以下優(yōu)點:由于存儲過程不像解釋執(zhí)行的SQL語句那樣在提出操作請求時才進行語句分析和優(yōu)化工作,因而運行效率高,它提供在服務器端快速執(zhí)行SQL語句的有效途徑。
存儲過程降低了客戶機和服務器之間的通信量??蛻魴C上的應用程序只要通過網絡向服務器發(fā)出調用存儲過程的名字和參數,就可以讓關系數據庫管理系統(tǒng)執(zhí)行其中的多行 SQL語句并進行數據處理。
另外也方便實施企業(yè)規(guī)則。可以把企業(yè)規(guī)則的運算程序寫成存儲過程放入數據庫服務器中,由關系數據庫管理,既有利于集中控制,又能夠方便地進行維護。當企業(yè)規(guī)則發(fā)生變化時只要修改存儲過程即可。
存儲過程的能力大大增強了SQL語言的功能和靈活性。存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的運算。
可保證數據的安全性和完整性。
理由1:通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而保證數據的安全。
理由2:通過存儲過程可以使相關的動作在一起發(fā)生,從而可以維護數據庫的完整性。
在運行存儲過程前,數據庫已對其進行了語法和句法分析,存儲過程只在創(chuàng)造時進行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數據庫執(zhí)行速度。并給出了優(yōu)化執(zhí)行方案。
這種已經編譯好的過程可極大地改善SQL語句的性能。由于執(zhí)行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執(zhí)行。
客戶端調用存儲過程只需要傳存儲過程名和相關參數即可,與傳輸SQL語句相比自然數據量少了很多。
在存儲過程中,可把體現企業(yè)規(guī)則的運算過程或接口程序放入數據庫服務器中,以便集中控制或當企業(yè)規(guī)則發(fā)生變化時在服務器中改變存儲過程即可,無須修改任何應用程序。
企業(yè)規(guī)則的特點是要經常變化,如果把體現企業(yè)規(guī)則的運算程序放入應用程序中,則當企業(yè)規(guī)則發(fā)生變化時,就需要修改應用程序工作量非常之大(修改、發(fā)行和安裝應用程序)。
如果把體現企業(yè)規(guī)則的運算放入存儲過程中,則當企業(yè)規(guī)則發(fā)生變化時,只要修改存儲過程就可以了,應用程序無須任何變化。
另外存儲過程可以重復使用,可減少數據庫開發(fā)人員的工作量。同時安全性高,可設定只有某些用戶才具有對指定存儲過程的執(zhí)行使用權。
3 數據庫存儲過程編程方法
存儲過程是過程化SQL語句,這個過程經編譯和優(yōu)化后存儲在數據庫服務器中,因此稱它為存儲過程,使用時只需要在數據庫環(huán)境或宿主語言中調用即可。
存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集。允許用戶聲明變量,存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優(yōu)化后存儲在數據庫服務器中。這樣每次調用可節(jié)省調用者發(fā)送SQL請求的開銷,存儲過程可由應用程序通過調用來執(zhí)行,也可在數據庫中創(chuàng)建、調試或運行。在創(chuàng)建存儲過程中,也可以使用游標來處理多行記錄的操作,這樣存儲過程既有SQL的非過程化特性,也有CURSOR游標的指針靈活性,面向記錄的過程化特性,所以在數據庫編程中,存儲過程是非常重要的一個方法。
存儲過程是數據庫中的一個重要對象,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執(zhí)行它。
同時,存儲過程可以接收和輸出參數、返回執(zhí)行存儲過程的狀態(tài)值,也可以嵌套調用。
4利用myql數據庫存儲過程方法生成汽車車牌記錄數據信息
基本的SQL是高度非過程化的語言。嵌入式SQL將SQL語句嵌入程序設計語言,借助高級語言的控制功能實現過程化。過程化SQL是對SQL的擴展,使其增加了過程化語句功能。
過程化SQL程序的基本結構是塊(Block)。所有的過程化SQL程序都是由塊組成的。這些塊之間可以相互嵌套,每一個塊完成一個邏輯操作。
一個完整的TSQL語句塊由以下3大部分組成:
DECALRE 定義部分 (該聲明定義部分是可選的)。
BEGIN
執(zhí)行處理部分,一般包含流程控制,數據查詢,DML,事務處理,游標處理等數據庫操作的功能。此部分是必須的。
END
聲明定義部分主要是變量和常量的定義:
1)變量定義
declare變量名 數據類型
2)賦值語句
Set 變量名=常量或表達式
Mysql TSQL程序控制語句
TSQL為了能夠更好地處理面向記錄的數據庫數據,必須有功能強大的流程控制語句。
過程化SQL提供了流程控制語句,主要有條件控制語句和循環(huán)控制語句。這些語句的語法、語義和一般的高級語言(如C語言)相似,這里只做概要的介紹。
1)條件控制語句
一般有三種形式的IF語句:IF-THEN語句、IF-THEN-ELSE語句和嵌套的IF語句。
(1)IF語句
IF condition THEN
Sequence_of_statements; /*條件為真是語句序列才被執(zhí)行*/
END IF /* 條件為假或NULL時什么也不做,控制轉移至下一個語句 */
2) IF-THEN 語句
IF condition THEN
Sequence_of_statementsl; /*條件為真時執(zhí)行語句序列1*/
ELSE
Sequence_of_statements2; /*條件為假或NULL時執(zhí)行語句序列2*/
END IF;
3) 嵌套的IF語句
在THEN和ELSE子句中還可以再包含IF語句,即嵌套IF語句。
2)循環(huán)控制語句
過程化SQL有三種循環(huán)結構:LOOP,WHILE-DO和FOR-LOOP。
(1)WHILE-DO循環(huán)語句
WHILE condition DO
Sequence_of_statements;/*條件為真時執(zhí)行循環(huán)體內的語句序列*/
END WHILE;
每次執(zhí)行循環(huán)語句之前首先要對條件進行求值,如果條件為真則執(zhí)行循環(huán)體的語句序列,如果條件為假則跳過循環(huán)并把控制傳遞給下一個語句。
(2)LOOP循環(huán)語句
該循環(huán)沒有內置循環(huán)條件,但可以通過leave 語句退出循環(huán)。表示形式如下:
LOOP_label:LOOP
Sequence_of_statements;
If condition then leave LOOP_label;
End if;
END LOOP;
(3)repeat循環(huán)語句
該語句執(zhí)行一次循環(huán)體,之后判斷condition條件是否為真,為真則退出循環(huán),否則繼續(xù)執(zhí)行循環(huán)體。repeat語句的表示形式如下。
REPEAT
Sequence_of_statements;
UNTIL condition
END REPEAT;
5具體存儲過程的設計步驟
存儲過程有以下特性:有輸入輸出參數;可以聲明變量;有if/else, case,while等控制語句。通過編寫存儲過程,可以實現復雜的邏輯功能。函數的普遍特性:模塊化,封裝,代碼復用;速度快,只有首次執(zhí)行需經過編譯和優(yōu)化步驟,后續(xù)被調用可以直接執(zhí)行,省去以上步驟。
步驟1:創(chuàng)建存儲過程,隨機生成車牌號
先創(chuàng)建個表(table),rand_Cid:用來存儲生成的序號及車牌號
CREATE TABLE rand_Cid
(
id INT AUTO_INCREMENT PRIMARY KEY,
cid CHAR(7)
)DEFAULT CHARACTER SET utf8;
步驟2:創(chuàng)建存儲過程ranCid2(num int),其中num參數是生成的記錄行數。 以下該過程實現隨機生成一個車牌號信息:
CREATE PROCEDURE ranCid2(num int)
BEGIN
DECLARE count int;
DECLARE i INT DEFAULT 0;
DECLARE sheng VARCHAR(31);
DECLARE shi CHAR(26);
DECLARE last CHAR(36);
DECLARE l_sheng CHAR(1);
DECLARE l_shi CHAR(1);
DECLARE last_str varchar(5);
DECLARE r_str varchar(7);
SET shi = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
SET sheng= '京津冀晉蒙遼吉黑滬蘇浙皖閩贛魯豫鄂湘粵桂瓊川貴云渝藏陜甘青寧新';
SET last = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
SET count =1;
SET i =1;
SET last_str = '';
SET l_sheng = SUBSTRING(sheng,FLOOR(1+RAND()*31),1);
SET l_shi = SUBSTRING(shi,FLOOR(1+RAND()*26),1);
WHILE i < 5 DO
Set last_str=
CONCAT(last_str,SUBSTRING(last,FLOOR(1+RAND()*36),1));
SET i=i+1;
END WHILE;
SET r_str = CONCAT(l_sheng,l_shi,'-',last_str);
INSERT INTO rand_Cid(cid) VALUES(r_str);
SET count =count+1;
END $
步驟3:創(chuàng)建存儲過程,調用ranCid2生成指定的num行記錄數據
CREATE PROCEDURE largeCid(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
CALL ranCid2(5);
SET i = i + 1;
UNTIL i>= num END REPEAT;
SELECT * FROM rand_Cid;
END $
在數據庫mysql提示符下輸入:mysql> call largeCid(10); 運行結果如下:
生成10行模擬表中數據,如果要生成100000行記錄,只要修改參數num,即調用存儲過程:call largeCid(100000),就可在表rand_Cid中生成100000記錄數據。
6 結論
通過利用數據庫存儲過程的方法,設計一個可生成輸入參數對應的數據記錄,該數據記錄可以是5萬行數據或100萬行數據或更多,都可以輕松指定產生,使軟件的開發(fā)測試數據和實際數據有相同的規(guī)模和真實的體驗,使軟件開發(fā)測試周期縮短,獲得了非常好的測試或調試預期效果,為進一步開發(fā)出實用的數據庫應用程序提供模擬的數據源。
參考文獻:
[1] 俞海. 數據庫基本原理及應用開發(fā)教程. 南京:南京大學出版社, 2015.